AGIの入り口の前:ソースコード: fllow_controller.py

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 フラグの値を返します。

コードの動作

  1. ユーザーからの入力を受け取ります。
  2. python_error_check 関数が呼び出されます。
  3. python_error_check 関数は、入力からPythonコードを抜き出し、一時ファイルとして保存します。
  4. tools.command_list.check_error_python_file_execute を使用してPythonコードを実行します。
  5. 実行結果に基づいて、エラーメッセージまたは標準出力を含むメッセージを返します。

使用例

# ユーザーからの入力
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は提供できません。)