2011-09-09 66 views
4

我正在嘗試完成Exercise 47Learn Python The Hard Way,第二版,但我在運行tests/ex47_tests.py時收到此錯誤:「ImportError:No module named」error does not seem to be related to my code

File "tests/ex47_tests.py", line 3, in <module> 
    from ex47.game import Room 
ImportError: No module named ex47.game 

我認爲這是我在我的代碼中做錯了,因爲我在這個非常新,所以我克隆this repo從誰似乎已經成功地完成了鍛鍊GitHub的用戶。

不僅我們的代碼的相關部分是相同的,而且當我嘗試運行我從他克隆的tests/ex47_tests.py時收到相同的錯誤。所以現在我迷路了,希望有人爲我解決問題。有任何想法嗎?

回答

3

從倉庫目錄:

PYTHONPATH=. python tests/ex47_tests.py 

確保沒有在您的路徑沒有其他ex47.py文件/包。

5

fabrizioM的答案應該能夠正常工作。這是一個小解釋。

當Python加載文件時,它會在文件系統上進行搜索。所以在這裏,我們有import語句:

from ex47.game import Room 

它查找模塊搜索路徑上的文件ex47.py(可在Python代碼sys.path中)。模塊搜索路徑包含一些基於Python安裝細節的目錄,PYTHONPATH環境變量中列出的目錄,幷包含您正在執行的腳本的父目錄。它在路徑中找不到ex47.py,但它看到裏面有一個名爲ex47的目錄,其中__init__.py。然後它會在該文件夾中找到game.py。

問題是您的當前文件夾不在模塊搜索路徑中。因爲運行了ex47_tests.py,它在路徑上有$ cwd/tests。你需要$ cwd的路徑。

PYTHONPATH=. python tests/ex47_tests.py 

確實如此。它將$ cwd放在模塊搜索路徑上,以便Python可以找到源文件。

你也可以這樣做:

python -m tests.ex47_tests 

這將運行它作爲一個模塊而不是一個文件,同時將使用當前目錄的路徑,它會自動在模塊搜索路徑,而不是目錄添加了該文件位於裏面。

+0

非常感謝你花時間寫這篇文章。 – Corey

+0

編輯文本以刪除sys.path/PYTHONPATH混合(將在審查後顯示)。 –

1

你的目錄結構有問題。這是我的目錄結構:

bin docs ex47 setup.py tests 

./bin: 

./docs: 

./ex47: 
game.py game.pyc __init__.py __init__.pyc 

./tests: 
ex47_tests.py ex47_tests.pyc __init__.py __init__.pyc 
3

本書要求您複製'skeleton'目錄,然後將其用於遊戲室練習(#47)。骨架目錄有一個「NAME」目錄。

所以如果你複製骨架目錄並命名爲ex47,那麼你會在其中有另一個ex47目錄。

lpthw > ex47 > ls 
bin  docs  ex47  setup.py tests 

所以當這本書說「10」接下來,創建一個簡單的文件ex47 /遊戲。py可以讓代碼測試「,你認爲它是最高級別的ex47。不正確!這就是爲什麼導入不會解決的原因

我也遇到同樣的問題,直到我意識到這本書調用外目錄「simplegame」由此可見一斑線在這本書(我們得到了通過複製「骨架」的一個) -

~/projects/simplegame $ nosetests 

因此,所有的關於PYTHONPATH答案是有效的,我只是想解釋爲什麼導入不起作用!

+0

啊哈,這是完全正確的。 – Kzqai

0

該項目命名爲ex47,其中有一個名爲ex47的文件夾 (前提是你已經根據他在此練習中的game.py文件代碼之前制定的計劃命名了你的文件) 當作者說創建一個簡單的文件ex47/game.py時,他表示文件夾中的文件夾是game.py文件應該被創建和存儲。

-1

我也有同樣的錯誤;是python的新手,我遵循本書的例子,在複製骨架目錄之後,重命名了包含'NAME'的任何文件 - 一個存在於test /目錄中,並且一旦刪除無法加載錯誤消失 - 檢查Microivan中的答案/內容上面的目錄發佈。 因此,在項目目錄中只應該存在兩個python文件,game.py和ex47_tests.py--希望你到達那裏,繼續下一個練習。