我是一位令人困惑的Python愛好者。我發佈了What else can I do to troubleshoot a package not importing in python yet imports in ipython while in a virtualenv?,認爲我的virtualenv存在問題。更多的故障排除表明這可能並非如此。將軟件包添加到sys.path的腳本從ipython運行時按預期導入,但在腳本從python運行時拋出異常
我會很感激任何見解或疑難解答提示,以便我可以繼續開發包。先謝謝你!與Python我的Ubuntu 14.04.1 LTS系統上的問題
簡介2.7.6:
- 我有一個名爲test_dummy.py腳本,將包路徑sys.path中,然後嘗試導入包。
- 腳本以
run test_dummy.py
在ipython內運行時,程序包無錯地導入。 - 當腳本以
python test_dummy.py
運行時,某些程序包將引發ImportError異常。 - 最令人沮喪的是,包含代碼的軟件包不止是一個
__init__.py
文件導入。只有__init__.py
文件的簡單測試包不會按預期導入。我無法確定是什麼原因導致最簡單的軟件包在從python調用腳本(即python test_dummy.py
)時在導入時拋出異常。
我的PWD是這樣的:
.
├── browser
├── display
├── hello_world
├── singleton
├── test_a
└── tests
test_a是這樣的:
test_a
├── __init__.py
└── __init__.pyc
程序hello_world是這樣的:
hello_world/
├── hello.py
├── hello.pyc
├── __init__.py
└── __init__.pyc
hello.py是這樣的:
HELLO = 'Hello, world!'
print HELLO
其他軟件包['browser','display','singleton']全部包含init .py文件和其他運行時不會引發已知異常的代碼。
測試是這樣:
tests
└── test_dummy.py
在test_dummy的代碼。潘岳:
import importlib
import os
import sys
HOME = os.path.expanduser('~')
PYTHON = os.path.join(HOME, 'development/my_python')
PACKAGES = [
'browser',
'display',
'singleton',
'test_a',
'hello_world',
]
MODULES = [
'',
'',
'',
'',
'hello',
]
IMPORTS = ['.'.join((pkg, module)).strip('.')
for pkg, module
in zip(PACKAGES, MODULES)]
"""
append sys.path with PACKAGES if package exists and not already
in the sys.path
"""
for package in PACKAGES:
package = os.path.join(PYTHON, package)
if os.path.exists(package) is True:
if package not in sys.path:
print "loading package '{0}'".format(package)
sys.path.append(package)
else:
print "package '{0}' already in sys.path".format(package)
else:
message = "Package '{0}' does not exist.".format(package)
raise IOError(message)
"""
import IMPORTS if the package is in sys.path
"""
for item in IMPORTS:
pkg_in_path = [pkg == os.path.basename(path)
for pkg in PACKAGES for path in sys.path]
if any(pkg_in_path):
print "loading '{0}'".format(item)
importlib.import_module(item)
else:
raise AttributeError("{0} not in sys.path".format(item))
IPython的結果:
$ ipython
# result
Python 2.7.6 (default, Mar 22 2014, 22:57:26)
Type "copyright", "credits" or "license" for more information.
IPython 2.2.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
Warning: disable autoreload in ipython_config.py to improve performance.
In [3]: run tests/test_dummy.py
loading package '/home/dmmmd/development/my_python/browser'
loading package '/home/dmmmd/development/my_python/display'
loading package '/home/dmmmd/development/my_python/singleton'
loading package '/home/dmmmd/development/my_python/test_a'
loading package '/home/dmmmd/development/my_python/hello_world'
loading 'browser'
loading 'display'
loading 'singleton'
loading 'test_a'
loading 'hello_world.hello'
Hello, world!
結果從python tests/test_dummy.py
:
loading package '/home/dmmmd/development/my_python/browser'
loading package '/home/dmmmd/development/my_python/display'
loading package '/home/dmmmd/development/my_python/singleton'
loading package '/home/dmmmd/development/my_python/test_a'
loading package '/home/dmmmd/development/my_python/hello_world'
loading 'browser'
loading 'display'
loading 'singleton'
loading 'test_a'
Traceback (most recent call last):
File "tests/test_dummy.py", line 46, in <module>
importlib.import_module(item)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named test_a
導入在Python解釋器包 'test_a' 不拋出異常:
Python 2.7.6 (default, Mar 22 2014, 22:57:26)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('/home/dmmmd/development/my_python/test_a')
>>> import test_a
>>> print test_a
<module 'test_a' from 'test_a/__init__.pyc'>
>>>
如何'__init __ py'在'test_a'長相?並在'瀏覽器'? – 2014-09-01 13:12:00
瀏覽器/ __ init__.py包含一條評論和'從瀏覽器導入Firefox'。在test_a中,__init__.py是空的。 – DMfll 2014-09-01 13:13:26
我不知道是什麼問題,您是否嘗試向'test_a'添加一些代碼或將'browser'文件夾名稱更改爲'test_a'並查看它是否已導入? – 2014-09-01 13:51:46