4

Learn Python The Hard Way, 2nd Edition の演習 47を完了しようとしていますが、実行すると次のエラーが表示されます。tests/ex47_tests.py

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

私はこれに非常に慣れていないため、コード内で間違ったことをしていると思ったので、演習を正常に完了したと思われる GitHub ユーザーからこのレポを複製しました。

コードの関連部分が同一であるだけでなく、tests/ex47_tests.py彼から複製した を実行しようとすると、同じエラーが表示されます。だから今、私は迷っており、誰かが私のために解決策を持っていることを望んでいます. 何か案は?

4

6 に答える 6

5

fabrizioM の答えはそれを機能させるはずです。ここに少し説明があります。

Python がファイルをロードするとき、ファイルシステムを検索します。したがって、ここに import ステートメントがあります。

from ex47.game import Room

モジュールの検索パス (Python コードでは sys.path としてアクセス可能) でファイル ex47.py を探します。モジュールの検索パスには、Python のインストールの詳細に基づくいくつかのディレクトリ、PYTHONPATH 環境変数にリストされているディレクトリ、および実行しているスクリプトの親ディレクトリが含まれています。パス上に ex47.py は見つかりませんが、その中に ex47 という名前のディレクトリがあることがわかり__init__.pyます。次に、そのフォルダーで game.py を見つけます。

問題は、現在のフォルダーがモジュールの検索パスにないことです。ex47_tests.py が実行されたため、パスに $cwd/tests が含まれています。パスに $cwd が必要です。

PYTHONPATH=. python tests/ex47_tests.py

まさにそれを行います。Python がソース ファイルを見つけられるように、モジュールの検索パスに $cwd を配置します。

次のこともできます。

python -m tests.ex47_tests

これにより、ファイルではなくモジュールとして実行されますが、現在のディレクトリがパスとして使用され、ファイルが内部にあるディレクトリではなく、モジュールの検索パスに自動的に追加されます。

于 2011-09-09T19:42:21.563 に答える
3

この本では、'skeleton' ディレクトリをコピーして、ゲーム ルームでの演習に使用するように求められています (#47)。スケルトン ディレクトリには「NAME」ディレクトリがあります。

したがって、スケルトン ディレクトリをコピーして ex47 という名前を付けると、その中に別の ex47 ディレクトリができます。

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

そのため、本に「次に、コードをテストするための簡単なファイル ex47/game.py を作成します」と書かれている場合は、それが最上位の ex47 であると想定します。正しくありません!そのため、インポートは解決されません。

本のこの行から明らかなように、本が外部ディレクトリ(「スケルトン」をコピーして取得したもの)を「シンプルゲーム」と呼んでいることに気付くまで、私も同じ問題にぶつかりました-

~/projects/simplegame $ nosetests

したがって、 PYTHONPATH に関するすべての回答は有効です。インポートが機能しない理由を説明したかっただけです!

于 2015-02-20T18:10:18.603 に答える
3

リポジトリ ディレクトリから:

PYTHONPATH=. python tests/ex47_tests.py

パスに他の ex47.py ファイル/パッケージがないことを確認してください。

于 2011-09-09T19:33:58.877 に答える
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
于 2013-06-17T14:26:32.713 に答える