2
import v_framework as framework
framework.loadModules(["Maintenance"])
framework.Maintenance.showPage()

framework我有:

def loadModules(aModules):
    d_utility = {"Maintenance":"COOl_M_PAGE"}
    for module in a_aModules:
        exec("import " + d_utility[module] + " as " + module)

执行时loadModules,它会导入v_framework命名空间中的模块。由于我正在导入v_frameworkas framework,我想我应该能够使用导入的模块framework.Maintenance。但它不是那样工作的。有没有办法做我想做的事情?或者,除了执行的名称空间之外,还有什么方法可以在名称空间中导入模块exec

4

2 回答 2

1

有用于动态导入模块的库。您可以使用importlib(另一个可能有用的是pkgutil)。现在,对于您的情况,我想这可以完成这项工作:

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 修改函数的本地命名空间,而不是全局命名空间(我认为)。

希望能帮助到你。:)

于 2012-04-13T20:18:51.220 回答
1

当您import在函数内部时,模块会正常导入/执行,但您导入的名称是函数的本地名称,就像在函数内部分配的任何其他变量一样。

>>> def test_import():
...    import os
...    print os
...
>>> test_import()
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> os
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined

os虽然已经导入,您仍然可以通过以下方式访问它sys.modules

>>> 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'>

一种快速而肮脏的方式来做你想做的事情是这样的;exec采用可选映射作为局部和全局变量。所以你可以做

def loadModules(aModules):
    d_utility = {"Maintenance":"COOl_M_PAGE"}
    for module in aModules:
        exec ('import %s as %s' % (d_utility[module], module)) in globals()

虽然这很丑陋并且可能具有安全隐患或其他东西。正如 jadkik94 所提到的,有些库提供了更简洁的方法来处理这个问题。

于 2012-04-13T20:22:27.630 回答