2010-08-21 159 views
4

我的導入有什麼問題?python導入錯誤

應用文件夾結構:

MYAPP/

  • 模型/ models.py包含SpotModel()
  • 測試/ tests.py包含TestSpotModel(unittest.TestCase生成)。 tests.py進口from myapp.models.models import *它就像一個魅力
  • 腳本/ import.py包含from myapp.models.models import *

的問題是,當import.py在錯誤執行的結果:

ImportError: No module named myapp.models.models 

但測試。 py運行。

我有__init__.py文件在myapp/__init__.py,myapp/models/__init__.py,myapp/tests/__init__.py和如上所述,運行使用鼻子測試的單元測試按預期工作。

+0

'來自foo import *'非常令人沮喪,因爲它會導致命名空間衝突。很難說出目前這種說法可能會發生什麼。 – msw 2010-08-21 14:03:14

+1

我也試着避免用'import'等Python關鍵字來命名模塊。現在你不能'輸入myapp.import'! – bobince 2010-08-21 14:06:52

+0

我將它重命名爲python myapp/scripts/data.py,但仍然是同樣的問題 – 2010-08-21 14:26:41

回答

4

它是__init__.py而不是init.py。確保層次結構中的每個目錄都包含它以便能夠導入。

編輯:我設法重現它。 這裏的目錄結構:

 
[email protected]:/tmp/asdasd$ tree 
. 
`-- myapp 
    |-- __init__.py 
    |-- models 
    | |-- __init__.py 
    | `-- models.py 
    |-- scripts 
    | |-- data.py 
    | `-- __init__.py 
    `-- tests 
     |-- __init__.py 
     `-- tests.py 

我把下面的代碼在data.py的一開始就縮小問題:

import sys 
import pprint 

pprint.pprint(sys.path) 

from myapp.models.models import * 

運行data.py的OP方式表示yeilds導入錯誤:

 
[email protected]:/tmp/asdasd$ python myapp/scripts/data.py 
['/tmp/asdasd/myapp/scripts', 
'/usr/lib/python2.6', 
'/usr/lib/python2.6/plat-linux2', 
'/usr/lib/python2.6/lib-tk', 
-- Skipped -- 
'/usr/local/lib/python2.6/dist-packages'] 
Traceback (most recent call last): 
    File "myapp/scripts/data.py", line 6, in 
    from myapp.models.models import * 
ImportError: No module named myapp.models.models 

但是,這種方式就像一個魅力:

 
[email protected]:/tmp/asdasd$ python -m myapp.scripts.data 
['', 
'/usr/lib/python2.6', 
'/usr/lib/python2.6/plat-linux2', 
'/usr/lib/python2.6/lib-tk', 
-- Skipped -- 
'/usr/local/lib/python2.6/dist-packages'] 

請注意第一項sys.path的區別。

+0

(這是一個markdown格式錯誤。) – bobince 2010-08-21 14:00:05

+0

他寫了'__init __。py',但最初沒有反引號,所以markdown認爲它應該顯示爲粗體。 – delnan 2010-08-21 14:00:57

+0

我是否還需要腳本文件夾中的__init__.py?我試圖添加它,但它仍然是相同的錯誤 – 2010-08-21 14:27:39

1

您好如何執行import.py?當你這樣做時,目前的工作目錄是什麼?

myapp目錄必須是Python的路徑上(即裏面sys.path列出的目錄之一)你能import它。 Python會在解釋器啓動時自動將當前工作目錄添加到路徑列表中。

所以,如果包含myapp目錄沒有手動添加到路徑(如使用PYTHONPATH環境變量,或將其添加到sitecustomize.pysys.path),您將需要在含有myapp目錄時運行腳本。如果你在myapp目錄本身,你將無法導入myapp包。

+0

我正在執行它像這樣python myapp/scripts/import.py – 2010-08-21 14:26:23

1

當您運行測試和運行腳本時,您的sys.path顯然不是相同的方式。做

import sys 
print(sys.path) 

在這兩個模塊的頂部來確認。然後,修復一個是錯的(通過附加到sys.path它缺少的情況下myapp父目錄。

0

除非你忘了提到它,你不必在myapp/scripts一個__init__.py,所以myapp/scripts/import.py不是的myapp模塊。

除非myapp是在你的全局路徑不知何故,該腳本找不到它,因爲它不會在正確的地方尋找它。

要麼使你的腳本由文件夾中的模塊將__init__.py添加到它,移動scr將文件系統層次結構(分成myapp或其父文件夾)或安裝myapp到您的路徑(即,將其移動到您的packages文件夾中,例如/usr/lib/python2.6/dist-packages/)。