2008-10-17 88 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