當使用__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 opencv作物不能正常工作
- 3. openstack:novaclient Python API不能正常工作
- 4. python raw_input with while不能正常工作
- 5. Python - cx_freeze腳本不能正常工作
- 6. Python列表不能正常工作
- 7. GUI程序不能正常工作PYTHON
- 8. Python雖然不能正常工作
- 9. Linebreak不能正常工作 - Python
- 10. python sqlite3不能正常工作
- 11. python sed不能正常工作
- 12. Python腳本不能正常工作
- 13. Python函數不能正常工作
- 14. Python shutil.copytree函數不能正常工作
- 15. Python re.search不能正常工作
- 16. python qt4不能正常工作
- 17. Python random.sample工作不正常?
- 18. setRingerMode正常不能正常工作
- 19. 正常化unicode不能正常工作
- 20. JS不能正常工作
- 21. jeditable不能正常工作
- 22. sharpdevelop.exe不能正常工作
- 23. Zimbra不能正常工作
- 24. ShellAndWait不能正常工作
- 25. TlbImp不能正常工作
- 26. Django不能正常工作
- 27. Tablesnap不能正常工作
- 28. glMatrix不能正常工作?
- 29. parse.Parse不能正常工作
- 30. PHP不能正常工作
這是非常有用的,從訪問任何內容,但是我真的沒有任何其他需要在我的程序中扭曲。儘管作爲創始人(!),你可能比我更懂得(從未使用過)。 – dwestbrook 2008-10-18 19:40:54