# 写入文件
def dump_python_file(python_file, data):
"""dump python file
"""
with io.open(python_file, 'w', encoding='utf-8') as stream:
stream.write(data)
# 加载模块详细见[添加链接描述](https://blog.csdn.net/weixin_43695063/article/details/121448806?spm=1001.2014.3001.5501)
def load_python_module(file_path):
""" load python module.
Args:
file_path: python path
Returns:
dict: variables and functions mapping for specified python module
{
"variables": {},
"functions": {}
}
"""
debugtalk_module = {
"variables": {},
"functions": {}
}
sys.path.insert(0, file_path)
module = importlib.import_module("debugtalk")
# 修复重载bug
importlib.reload(module)
sys.path.pop(0)
for name, item in vars(module).items():
if is_function((name, item)):
debugtalk_module["functions"][name] = item
elif is_variable((name, item)):
if isinstance(item, tuple):
continue
debugtalk_module["variables"][name] = item
else:
pass
return debugtalk_module
# 生成临时文件
def load_debugtalk(project):
"""import debugtalk.py in sys.path and reload
project: int
"""
# 从数据库读取驱动代码(就是py文件的def和class等)
code = models.Debugtalk.objects.get(project__id=project).code
# debugtalk.py
file_path = os.path.join(tempfile.mkdtemp(prefix='mulu'), "debugtalk.py")
# 将驱动代码写到debugtalk.py中
FileLoader.dump_python_file(file_path, code)
# 加载模块
debugtalk = FileLoader.load_python_module(os.path.dirname(file_path))
#递归删除临时debugtalk.py文件及目录
shutil.rmtree(os.path.dirname(file_path))
return debugtalk
生成临时文件
最新推荐文章于 2023-07-17 13:42:43 发布