Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在不同的命名空间中动态导入模块_Python_Namespaces_Import - Fatal编程技术网

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()