2008-10-17 129 views

回答

52

從python文檔上__import__

__import__(name[, globals[, locals[, fromlist[, level]]]]) 

...

當名稱變量的形式 package.module的,通常, 頂層包(的名稱一直到 第一個點)返回,而不是按名稱命名的 模塊。但是,如果給出了非空的fromlist參數 ,則返回名稱爲name的模塊。 這樣做是爲了兼容 爲 生成的不同種類的導入語句的字節碼; 當使用「import spam.ham.eggs」時, 頂級包垃圾郵件必須在導入命名空間中放置 ,但是當 使用「from spam.ham import eggs」時,必須使用 spam.ham子包到 找到變蛋。作爲此行爲的 解決方法,請使用 getattr()提取所需的 組件。例如,你可以 定義下列助手:

def my_import(name): 
    mod = __import__(name) 
    components = name.split('.') 
    for comp in components[1:]: 
     mod = getattr(mod, comp) 
    return mod 

套用:

當你問somepackage.somemodule__import__回報somepackage.__init__.py,這往往是空的。

它將返回somemodule如果提供fromlist(內somemodule變量名你想,這是不實際返回的列表)

你也可以像我一樣,用他們建議的功能。

注:我問這個問題,完全打算自己回答。我的代碼中存在一個大錯誤,並且誤診了它,花了很長時間才弄明白,所以我想我會幫助SO社區併發布我在這裏遇到的問題。

7

也有一些是因爲你希望它的作品:twisted.python.reflect.namedAny

>>> from twisted.python.reflect import namedAny 
>>> namedAny("operator.eq") 
<built-in function eq> 
>>> namedAny("pysqlite2.dbapi2.connect") 
<built-in function connect> 
>>> namedAny("os") 
<module 'os' from '/usr/lib/python2.5/os.pyc'> 
+0

這是非常有用的,從訪問任何內容,但是我真的沒有任何其他需要在我的程序中扭曲。儘管作爲創始人(!),你可能比我更懂得(從未使用過)。 – dwestbrook 2008-10-18 19:40:54

32

Python 2.7版有導入庫,虛線路徑解決預期

import importlib 
foo = importlib.import_module('a.dotted.path') 
instance = foo.SomeClass() 
+2

還有一個python 2.6軟件包可以反向運行這個功能。 https://pypi.python.org/pypi/importlib/ – melinath 2013-03-14 21:03:38

1

對於Python 2.6,我寫了這個片斷:

def import_and_get_mod(str, parent_mod=None): 
    """Attempts to import the supplied string as a module. 
    Returns the module that was imported.""" 
    mods = str.split('.') 
    child_mod_str = '.'.join(mods[1:]) 
    if parent_mod is None: 
     if len(mods) > 1: 
      #First time this function is called; import the module 
      #__import__() will only return the top level module 
      return import_and_get_mod(child_mod_str, __import__(str)) 
     else: 
      return __import__(str) 
    else: 
     mod = getattr(parent_mod, mods[0]) 
     if len(mods) > 1: 
      #We're not yet at the intended module; drill down 
      return import_and_get_mod(child_mod_str, mod) 
     else: 
      return mod 
16

有一個簡單的解決方案,如文檔中說明:

如果你只是想按名稱導入一個模塊(可能在一個包內),你可以調用__import __()然後在sys中查找它。模塊:

>>> import sys 
>>> name = 'foo.bar.baz' 
>>> __import__(name) 
<module 'foo' from ...> 
>>> baz = sys.modules[name] 
>>> baz 
<module 'foo.bar.baz' from ...> 
0

我做的方法是

foo = __import__('foo', globals(), locals(), ["bar"], -1) 
foobar = eval("foo.bar") 

的話,我可以通過

foobar.functionName() 
+1

爲什麼不只是`foo.bar`在那一點? – 2014-08-19 13:39:27