动态导入整个模块

时间:2018-03-11 09:48:50

标签: python python-3.x

我想知道是否有办法动态导入整个模块(相当于" import * some_module")。

经过对其他帖子的一些研究后,我看到你可以动态地导入some_module",但不能拉动整个模块。

为了澄清我的问题,

some_module:

SOME_VARIABLE = 1

模块a:

if(1 == 1):
    __import__("some_module");

模块b:

from module a import *
print(SOME_VARIABLE);

运行此代码会返回一个无法识别的变量异常,我想阻止它。

激励:

假设我有一个全局模块,它通过一个接收参数的函数导入多个其他模块。

示例:

模块a:

import_modules(modules_id):
    if(modules_id == 1):
        from module_c import *
        from module_d import *
    else :
        from module_e import *

模块b:

from module a import *
import_modules(1);

我希望通过显式调用访问module_c / d中的所有变量。

我的实际问题:

我有一个接口驱动程序,它使用不同的协议与不同的设备交互(每个通过不同的类实现),这些协议有一些相似之处,例如:它们都有一个CUSTOMER_STATUS字典(在protcol_a / b_global_def中定义)由特定协议导入的模块。

我遇到的问题是两个协议都有相同名称的变量,并且由于接口驱动程序需要识别它们,我无法知道我从使用接口驱动程序的程序访问哪个变量(导入它)

考虑到使用接口驱动程序的程序只能动态地知道它需要使用哪个协议,我想避免在程序内手动导入协议全局def(即使我想在程序中使用它的变量)。

3 个答案:

答案 0 :(得分:2)

这几乎肯定是XY problem ......但要证明它可以做到......

假设some_module

SOME_VARIABLE = 1

使模块a成为:

globals().update(__import__("some_module").__dict__)

现在在b

from a import *
print(SOME_VARIABLE)

将产生您想要的结果。

这里发生了什么?a我们导入some_module,然后使用代表其命名空间的__dict__,并使用它来更新全局变量a

答案 1 :(得分:1)

模块a

exec('from some_module import *')

模块b

import importlib
a=importlib.import_module('module a')
for i in dir(a):
    if not i.startswith('_'):
        exec('{0}=a.{0}'.format(i))
print(SOME_VARIABLE);

答案 2 :(得分:0)

扩展donkopotamus的答案

将模块设为:

def load_module():
    globals().update(__import__("some_module").__dict__)

现在在b

from a import *
load_module()
from a import *
print(SOME_VARIABLE)