2012-03-20 204 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進口您需要從運行時確定的導入模塊導入。