动态导入整个modu

2024-04-23 08:06:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一种方法可以动态导入整个模块(相当于“import*some\ u 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);

我想通过显式调用访问模块c/d中的所有变量。你知道吗

我的实际问题:

我有一个接口驱动程序,它使用不同的协议(每个协议通过不同的类实现)与不同的设备进行交互,这些协议有一些相似之处,例如:它们都有一个CUSTOMER\u STATUS dict(在protcol\u a/b\u global\u def模块中定义,该模块由特定协议导入)。你知道吗

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

考虑到使用接口驱动程序的程序只动态地知道它需要使用哪个协议,并且我希望避免在程序中手动导入协议全局定义(即使我希望在程序中使用它的变量)。你知道吗


Tags: 模块fromimport程序modulesid协议if
3条回答

donkopotamus答案的扩展

使模块成为:

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

现在在b

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

这几乎可以肯定是一个^{} 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中的全局变量。你知道吗

模块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);

相关问题 更多 >