动态导入Python模块

9

我试图导入一个未知名称的模块的成员。与其使用

import foo

我正在使用:

__import__("foo")

我该如何在不使用"eval"的情况下实现from foo import bar相似的功能?
更新:看起来fromlist解决了问题。有没有一种方法可以模拟from foo import *fromlist=['*']并不能解决问题。
4个回答

11

要模拟 from foo import *,您可以使用 dir 来获取导入模块的属性:

foo = __import__('foo')
for attr in dir(foo):
    if not attr.startswith('_'):
        globals()[attr] = getattr(foo, attr)

通常不赞成使用from foo import *,模拟它更是如此,我想。


+1 我正在使用 builtins 而不是 globals(),这样我就可以从另一个模块中使用这段代码。 - B T

9
__import__("foo", fromlist=["bar"])

了解更多信息,请参考help(__import__)


谢谢。有没有一种方法可以模拟“from foo import *”? - ustun

1

你可以通过__import__动态导入。在__import__中有一个fromlist关键字参数,用于调用from foo import bar


谢谢。有没有一种方法可以模拟“from foo import *”? - ustun

0
有时候你想要导入多个配置文件中的一个,每个文件中都有相同名称的变量、字典等不同的值。
你不能只是这样做:
def mother_function(module, *args, **kwargs):
    from module import variable
    return variable

def call_home_to_mamma():
    import module_42
    return mother_function(module_42)

“这个为什么不起作用的解释超出了我的薪资范围,涉及到闭包和命名空间。我发现有效的方法是使用'module_name'作为字符串参数调用母函数,然后在我真正需要它时动态导入特定变量:”
def mother_function(module_name, *args, **kwargs):
    exec('from %s import %s' % (module_name, variable))
    variable = eval(variable)
    return variable

def call_home_to_mamma():
    import module_42
    return mother_function(module_42.__name__)

太棒了...你可以在运行时从导入的模块中动态导入任何变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接