12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import time
- import importlib
- from toolbox import trimmed_format_exc, gen_time_str, get_log_folder
- from toolbox import CatchException, update_ui, gen_time_str, trimmed_format_exc, is_the_upload_folder
- from toolbox import promote_file_to_downloadzone, get_log_folder, update_ui_lastest_msg
- import multiprocessing
- def get_class_name(class_string):
- import re
- # Use regex to extract the class name
- class_name = re.search(r'class (\w+)\(', class_string).group(1)
- return class_name
- def try_make_module(code, chatbot):
- module_file = 'gpt_fn_' + gen_time_str().replace('-','_')
- fn_path = f'{get_log_folder(plugin_name="gen_plugin_verify")}/{module_file}.py'
- with open(fn_path, 'w', encoding='utf8') as f: f.write(code)
- promote_file_to_downloadzone(fn_path, chatbot=chatbot)
- class_name = get_class_name(code)
- manager = multiprocessing.Manager()
- return_dict = manager.dict()
- p = multiprocessing.Process(target=is_function_successfully_generated, args=(fn_path, class_name, return_dict))
- # only has 10 seconds to run
- p.start(); p.join(timeout=10)
- if p.is_alive(): p.terminate(); p.join()
- p.close()
- return return_dict["success"], return_dict['traceback']
- # check is_function_successfully_generated
- def is_function_successfully_generated(fn_path, class_name, return_dict):
- return_dict['success'] = False
- return_dict['traceback'] = ""
- try:
- # Create a spec for the module
- module_spec = importlib.util.spec_from_file_location('example_module', fn_path)
- # Load the module
- example_module = importlib.util.module_from_spec(module_spec)
- module_spec.loader.exec_module(example_module)
- # Now you can use the module
- some_class = getattr(example_module, class_name)
- # Now you can create an instance of the class
- instance = some_class()
- return_dict['success'] = True
- return
- except:
- return_dict['traceback'] = trimmed_format_exc()
- return
-
- def subprocess_worker(code, file_path, return_dict):
- return_dict['result'] = None
- return_dict['success'] = False
- return_dict['traceback'] = ""
- try:
- module_file = 'gpt_fn_' + gen_time_str().replace('-','_')
- fn_path = f'{get_log_folder(plugin_name="gen_plugin_run")}/{module_file}.py'
- with open(fn_path, 'w', encoding='utf8') as f: f.write(code)
- class_name = get_class_name(code)
- # Create a spec for the module
- module_spec = importlib.util.spec_from_file_location('example_module', fn_path)
- # Load the module
- example_module = importlib.util.module_from_spec(module_spec)
- module_spec.loader.exec_module(example_module)
- # Now you can use the module
- some_class = getattr(example_module, class_name)
- # Now you can create an instance of the class
- instance = some_class()
- return_dict['result'] = instance.run(file_path)
- return_dict['success'] = True
- except:
- return_dict['traceback'] = trimmed_format_exc()
|