[英]ImportError: No module named package
我發現Python中的導入模塊很復雜,所以我正在做實驗來清理它。 這是我的文件結構:
PythonTest/
package/
__init__.py
test.py
__init__.py
內容:
package = 'Variable package in __init__.py'
from package import test
test.py
內容:
from package import package
print package
當我不在package
(在PythonTest
),並執行python package/test.py
,我得到:
Traceback (most recent call last):
File "package/test.py", line 1, in <module>
from package import package
ImportError: No module named package
預期的輸出是Variable package in __init__.py
。 我究竟做錯了什么?
但是,我可以在交互模式下獲得預期的輸出:
sunqingyaos-MacBook-Air:PythonTest sunqingyao$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import package
Package in __init__.py
首先讓我們看看Python如何搜索包和模塊。 sys.path
一個字符串列表,指定模塊的搜索路徑。 從環境變量
PYTHONPATH
初始化,加上依賴於安裝的默認值。
那是搜索路徑。 因此,如果您的模塊/包位於sys.path
,python解釋器能夠找到並導入它。 該文件說的更多:
在程序啟動時初始化時,此列表的第一項
path[0]
是包含用於調用Python解釋器的腳本的目錄。 如果腳本目錄不可用(例如,如果以交互方式調用解釋器或者從標准輸入讀取腳本),則path[0]
為空字符串,指示Python首先搜索當前目錄中的模塊。
我修改了test.py
作為示例。
import sys; import pprint
pprint.pprint(sys.path)
from package import package
print package
有兩種情況:
$ python package/test.py
['/Users/laike9m/Dev/Python/TestPython/package',
'/usr/local/lib/python2.7/site-packages/doc2dash-2.1.0.dev0-py2.7.egg',
'/usr/local/lib/python2.7/site-packages/zope.interface-4.1.3-py2.7-macosx-10.10-x86_64.egg',
'/usr/local/lib/python2.7/site-packages/six-1.10.0-py2.7.egg',
'/usr/local/lib/python2.7/site-packages/colorama-0.3.3-py2.7.egg',
如您所見, path[0]
是/Users/laike9m/Dev/Python/TestPython/package
,它是包含用於調用Python解釋器的腳本test.py
的目錄。
$ python
Python 2.7.12 (default, Jun 29 2016, 14:05:02)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import package
['',
'/usr/local/lib/python2.7/site-packages/doc2dash-2.1.0.dev0-py2.7.egg',
'/usr/local/lib/python2.7/site-packages/zope.interface-4.1.3-py2.7-macosx-10.10-x86_64.egg',
'/usr/local/lib/python2.7/site-packages/six-1.10.0-py2.7.egg',
'/usr/local/lib/python2.7/site-packages/colorama-0.3.3-py2.7.egg',
...
現在是第二種情況,當以交互方式調用時,“ path[0]
是空字符串,它指示Python首先搜索當前目錄中的模塊。” 目前的目錄是什么? /Users/laike9m/Dev/Python/TestPython/
。(看看這是我機器上的路徑,它等同於你的PythonTest
路徑)
現在你知道了答案:
為什么python package/test.py
給出了ImportError: No module named package
?
因為解釋器沒有“看到”包。 為了讓解釋器知道包的package
, PythonTest
必須在sys.path
,但事實並非如此。
為什么這在交互模式下工作?
因為現在PythonTest
在sys.path
,所以解釋器能夠找到package
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.