2012-03-20 205 views
8

我想导入名称未知的模块的成员。取而代之的动态导入Python模块

import foo 

我使用:

__import__("foo") 

我如何才能实现对from foo import bar箱子而不是诉诸的“EVAL”类似的事情?

更新:看来fromlist做到了。有没有类似from foo import *的方法? fromlist=['*']没有做到这一点。

回答

10

为了模拟from foo import *可以使用dir得到导入模块的属性:

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

使用from foo import *在一般皱着眉头,并模仿它更是这样,我会想象。

+0

+1我使用__builtins__而不是globals(),以便我可以使用另一个模块的代码。 – 2012-10-16 00:15:01

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

了解更多信息help(__import__)

+0

谢谢。有没有办法模仿“从富进口*”? – ustun 2012-03-20 09:21:26

1

您可以用动态的__import__帮助进口。有fromlist的关键参数__import__致电from foo import bar

+0

谢谢。有没有办法模仿“从富进口*”? – ustun 2012-03-20 09:18:37

0

有时要导入的许多配置文件中的一个,每一个为相同的命名变量有不同的价值观,http://stardict.sourceforge.net/Dictionaries.php下载等

你不能做到这一点:

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”作为一个字符串参数母函数,然后dyamically导入特定变量的时候我真的需要它:

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

宾果....你有任何变量的dyamic进口您需要从运行时确定的导入模块导入。