当使用__import__
与虚线的名称,如:somepackage.somemodule
,返回的模块不是somemodule
,无论返回似乎都是空的!这里发生了什么?Python的__import__不能正常工作
回答
从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社区并发布我在这里遇到的问题。
也有一些是因为你希望它的作品: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'>
Python 2.7版有导入库,虚线路径解决预期
import importlib
foo = importlib.import_module('a.dotted.path')
instance = foo.SomeClass()
还有一个python 2.6软件包可以反向运行这个功能。 https://pypi.python.org/pypi/importlib/ – melinath 2013-03-14 21:03:38
对于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
有一个简单的解决方案,如文档中说明:
如果你只是想按名称导入一个模块(可能在一个包内),你可以调用__import __()然后在sys中查找它。模块:
>>> import sys
>>> name = 'foo.bar.baz'
>>> __import__(name)
<module 'foo' from ...>
>>> baz = sys.modules[name]
>>> baz
<module 'foo.bar.baz' from ...>
我做的方法是
foo = __import__('foo', globals(), locals(), ["bar"], -1)
foobar = eval("foo.bar")
的话,我可以通过
foobar.functionName()
为什么不只是`foo.bar`在那一点? – 2014-08-19 13:39:27
- 1. Python不能正常工作?
- 2. Python re.search不能正常工作
- 3. python sqlite3不能正常工作
- 4. python raw_input with while不能正常工作
- 5. Linebreak不能正常工作 - Python
- 6. openstack:novaclient Python API不能正常工作
- 7. Python脚本不能正常工作
- 8. Python random.sample工作不正常?
- 9. setRingerMode正常不能正常工作
- 10. NSTimer不能正常工作
- 11. QTcpServer不能正常工作
- 12. haarcascade_frontalface_alt.xml不能正常工作
- 13. break;不能正常工作
- 14. ScaleTransform不能正常工作
- 15. onchange不能正常工作
- 16. hook_form_alter不能正常工作
- 17. isalpha()不能正常工作
- 18. GCM不能正常工作
- 19. JPQL不能正常工作
- 20. Firebase不能正常工作
- 21. check50不能正常工作
- 22. struts.action.excludePattern不能正常工作,
- 23. ListView.setSelection不能正常工作
- 24. Strpos不能正常工作
- 25. TaskService不能正常工作
- 26. runOnUiThread不能正常工作
- 27. WAMP不能正常工作
- 28. CAAnimationGroup不能正常工作
- 29. FiPy不能正常工作
- 30. Django不能正常工作
这是非常有用的,从访问任何内容,但是我真的没有任何其他需要在我的程序中扭曲。尽管作为创始人(!),你可能比我更懂得(从未使用过)。 – dwestbrook 2008-10-18 19:40:54