簡體   English   中英

ImportError:沒有名為package的模塊

[英]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路徑)

現在你知道了答案:

  1. 為什么python package/test.py給出了ImportError: No module named package

    因為解釋器沒有“看到”包。 為了讓解釋器知道包的packagePythonTest必須在sys.path ,但事實並非如此。

  2. 為什么這在交互模式下工作?

    因為現在PythonTestsys.path ,所以解釋器能夠找到package

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM