我正在尝试如here所述动态加载模块。
我编写了一个脚本,该脚本要求某些模块在某些系统上默认情况下可能未安装(例如requests
)。脚本代码假定已完成常规import
(它使用requests.get
)。
如果我使用上面链接中的代码,要导入requests
,我将必须使用:
requests=importlib.import_module('requests')
但是由于我有几个模块,所以这导致很多代码重复。我不能在循环中使用它,因为变量名称必须随导入的模块一起更改。
我发现我可以使用:
for m in list_of_modules:
locals()[m]=importlib.import_module(m)
一切都会发生,就好像我做了常规的import
一样。
(当然,真正的代码会捕获异常...)。
所以问题是,这有多有效?太真实了吗? (如果有,Python 2.7会有所作为)
答案 0 :(得分:2)
它显然是无效的。 Python 2.7.15的文档提到了locals()
函数:
此字典的内容不应修改;更改可能不会影响解释器使用的局部变量和自由变量的值。
locals()
是程序了解功能块中变量列表的一种方式。这不是创建局部变量的方法。
如果您确实需要类似的内容,则可以使用本地地图,依靠由sys.modules
更新的import_module
地图,也可以更新globals()
地图。无论如何,一旦模块被加载,整个程序就存在(通过sys.module
映射),因此将其引用存储在本地符号表中并没有任何意义。
因此,如果您确实需要导入动态构建的模块列表,则可以这样做:
for m in list_of_modules:
globals()[m]=importlib.import_module(m)