Python:在不同的命名空间中动态导入模块
在Python:在不同的命名空间中动态导入模块,python,namespaces,import,Python,Namespaces,Import,在框架中我有: import v_framework as framework framework.loadModules(["Maintenance"]) framework.Maintenance.showPage() 当执行loadModules时,它将导入v_框架命名空间中的模块。由于我将v_framework导入为framework,我认为我应该能够使用framework.Maintenance使用导入的模块。但它不是这样工作的。 有没有办法做我想做的事?或者,除了执行exec的名称
框架中
我有:
import v_framework as framework
framework.loadModules(["Maintenance"])
framework.Maintenance.showPage()
当执行loadModules
时,它将导入v_框架
命名空间中的模块。由于我将v_framework
导入为framework
,我认为我应该能够使用framework.Maintenance
使用导入的模块。但它不是这样工作的。
有没有办法做我想做的事?或者,除了执行
exec
的名称空间之外,还有其他方法可以导入名称空间中的模块吗?有用于动态导入模块的库。您可以使用(另一个可能有用的方法是)。现在,就你的情况而言,我想这会起作用:
def loadModules(aModules):
d_utility = {"Maintenance":"COOl_M_PAGE"}
for module in a_aModules:
exec("import " + d_utility[module] + " as " + module)
更新:exec修改函数的本地名称空间,而不是全局名称空间(我认为)
希望有帮助。:) 当您在函数内部导入时,模块将正常导入/执行,但您导入的名称是函数的本地名称,就像在函数内部分配的任何其他变量一样
import importlib
mods = {}
def loadModules(aModule):
global mods
mods[module] = importlib.import_module(d_utility[module])
# or maybe globals()[module] = ... would work also (exactly as you expect it to
一种快速而肮脏的方式来做你想做的事情,就是这样exec
采用可选映射作为局部和全局变量。所以你可以
>>> import sys
>>> sys.modules['os']
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> os = sys.modules['os']
>>> os
<module 'os' from '/usr/lib/python2.7/os.pyc'>
虽然这很难看,可能有安全隐患或其他什么。正如jadkik94所提到的,有些库提供了更干净的方法来处理这个问题
>>> import sys
>>> sys.modules['os']
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> os = sys.modules['os']
>>> os
<module 'os' from '/usr/lib/python2.7/os.pyc'>
def loadModules(aModules):
d_utility = {"Maintenance":"COOl_M_PAGE"}
for module in aModules:
exec ('import %s as %s' % (d_utility[module], module)) in globals()