AIの出力から、pythonコードを抜き出す関数が主にある。今後web検索系の関数も入ってくるかもしれない。
import tools.command_list
import os
class FllowControlleData():
def __init__(self):
self.code_error = False
self.code = ""
self.ext_list = [] # 拡張子
g_fcd = FllowControlleData()
# ファイルの実行とputhonエラーの報告
def get_file_list(folder_path):
"""指定されたフォルダ内のファイルリストを取得する関数。
Args:
folder_path: ファイルリストを取得したいフォルダのパス。
Returns:
フォルダ内のファイルリスト。
"""
file_list = []
folder_path = os.path.normpath(folder_path) # パスを正規化
for root, _, files in os.walk(folder_path):
for file in files:
file_list.append(os.path.join(root, file))
return file_list
def get_program_code_from_response(r_str):
# プログラムコードw抜き出す
lines = r_str.split("\n")
now_code = False
code_dict = {}
ctype = ""
for line in lines:
l_line = line.lower()
l_line = line.rstrip()
if l_line.startswith("```"):
now_code = True
ctype = l_line[3:]
if ctype not in code_dict:
code_dict[ctype] = ""
print("ctype", ctype)
continue
if "```" == l_line:
now_code = False
continue
if now_code:
code_dict[ctype] += line + "\n"
return code_dict
def save_program_code_to_temp(code_dict):
for key, value in code_dict.items():
if "" != key:
if "python" == key:
ext = ".py"
elif "javascript" == key:
ext = ".js"
elif "c++" == key:
ext = ".cpp"
elif "c++" == key:
ext = ".cpp"
elif "ruby" == key:
ext = ".rb"
elif "perl" == key:
ext = ".pl"
elif "r" == key:
ext = ".rd"
else:
ext = "." + key
# コードの種類を設置
g_fcd.ext_list.append(ext)
print("key", key)
tools.command_list.save_program_file("temp"+ext, value)
def python_error_check(r_str):
g_fcd.ext_list = []
code = get_program_code_from_response(r_str)
print("code", code)
if g_fcd.code == code:
return "ソースコードが前から変わっていません"
g_fcd.code = code
save_program_code_to_temp(code)
print("g_fcd.ext_list", g_fcd.ext_list)
if ".py" in g_fcd.ext_list:
print("python_error_check step 01")
output, error, returncode = tools.command_list.check_error_python_file_execute("temp.py", "")
print("output, error", output, error, returncode)
if "" == output and "" == error:
g_fcd.code_error = False
return ""
elif "" == error:
g_fcd.code_error = False
return "実行した結果。標準出力の内容は\r\n" + output + "\r\n"
elif "" == output:
g_fcd.code_error = True
return "実行した結果。エラーが発生しました。\r\nエラーの内容は\r\n" + error + "\r\n"
else:
g_fcd.code_error = True
return "実行した結果。エラーが発生しました。\r\nエラーの内容は\r\n" + error + "\r\n標準出力の内容は\r\n" + output + "\r\n"
else:
g_fcd.code_error = False
return ""
def get_code_error():
return g_fcd.code_error
AIによる解説
ファイル実行とPythonエラーチェックのコード解説
このコードは、ユーザーからの入力を受け取り、その中に含まれるプログラムコードを実行し、Pythonエラーが発生した場合にエラーメッセージを返す機能を提供します。
コードの構成
コードは以下のようなクラスと関数で構成されています。
1. FllowControlleData
クラス
code_error
: プログラムコードの実行時にエラーが発生したかどうかを示すフラグ。code
: 前回実行したプログラムコードを保持する変数。ext_list
: プログラムコードの拡張子リストを保持する変数。
2. get_file_list
関数
- 指定されたフォルダ内のファイルリストを取得します。
os.walk
を使用してフォルダを再帰的に探索し、ファイルパスをリストに追加します。
3. get_program_code_from_response
関数
- ユーザーからの入力からプログラムコードを抜き出します。
- 入力文字列を改行で分割し、““` で囲まれた部分をプログラムコードとして認識します。
- コードの種類(Python、JavaScript、C++など)を識別し、コードを辞書型で返します。
4. save_program_code_to_temp
関数
- 抜き出したプログラムコードを一時ファイルとして保存します。
- コードの種類に基づいて適切な拡張子を付与し、
tools.command_list.save_program_file
を使用してファイルを保存します。
5. python_error_check
関数
- ユーザーからの入力に含まれるPythonコードを実行し、エラーが発生した場合にエラーメッセージを返します。
get_program_code_from_response
を使用してコードを抜き出し、save_program_code_to_temp
を使用して一時ファイルとして保存します。tools.command_list.check_error_python_file_execute
を使用してPythonコードを実行し、エラーメッセージと標準出力を取得します。- エラーが発生した場合、エラーメッセージと標準出力を含むメッセージを返します。
- エラーが発生しなかった場合、標準出力を含むメッセージを返します。
6. get_code_error
関数
FllowControlleData
クラスのcode_error
フラグの値を返します。
コードの動作
- ユーザーからの入力を受け取ります。
python_error_check
関数が呼び出されます。python_error_check
関数は、入力からPythonコードを抜き出し、一時ファイルとして保存します。tools.command_list.check_error_python_file_execute
を使用してPythonコードを実行します。- 実行結果に基づいて、エラーメッセージまたは標準出力を含むメッセージを返します。
使用例
# ユーザーからの入力
user_input = "```python\nprint('Hello, world!')\n```"
# Pythonコードを実行し、エラーメッセージを取得
error_message = python_error_check(user_input)
# エラーメッセージを出力
print(error_message)
まとめ
このコードは、ユーザーからの入力に含まれるPythonコードを実行し、エラーが発生した場合にエラーメッセージを返す機能を提供します。tools.command_list
モジュールを使用することで、Pythonコードの実行とエラーチェックを簡素化しています。
参考URL:
- os.walk
- tools.command_list (このモジュールはコード内に定義されているため、URLは提供できません。)