我正在尝试在运行时动态导入Python模块,但是我希望导入代码为正在导入的模块提供缺少的变量。
builtins
模块可以实现我想要的行为,但是我不知道这是最佳实践还是最佳方式。其次,我想将要导入的文件告诉导入代码需要提供哪些变量。我有2个潜在的解决方案:
exec_module
,捕获名称错误,解析出丢失的变量,将其添加到内置变量中,然后重新运行exec_module直到成功。file_to_import.py
中提供一些注释,例如# VARIABLES var1 var2 var3
,然后从文件中读取第一行(并解析此注释)在exec_module
之前。基本上我拥有的是
file_to_import.py:
# Potentially: VARIABLES my_inserted_variable
print(my_inserted_variable)
file_that_does_the_import.py
# `values` is some dictionary of values I could provide
complete, stored_attributes = False, set()
while not complete:
try:
spec.loader.exec_module(foo)
complete = True
except NameError as e:
name = str(e).split("'")[1]
if name not in values:
raise e
setattr(builtins, name, values.get(name))
stored_attributes.add(name)
for k in stored_attributes:
delattr(builtins, k)
只想知道builtins
是否是完成将数据从导入代码传递到导入模块的最佳方法。