4

私の輸入品の何が問題になっていますか?

アプリのフォルダー構造:

myapp /

  • models/models.pyにはSpotModel()
  • tests / tests.pyには、TestSpotModel(unittest.TestCase)が含まれています。from myapp.models.models import *チャームのように機能するtests.pyインポート
  • scripts/import.pyに含まれるものfrom myapp.models.models import *

問題は、import.pyを実行するとエラーが発生することです。

ImportError: No module named myapp.models.models

しかし、tests.pyは実行されます。

、に__init__.pyファイルがあり、前述のように、nosetestsを使用して単体テストを実行すると意図したとおりに機能します。myapp/__init__.pymyapp/models/__init__.pymyapp/tests/__init__.py

4

4 に答える 4

4

ではあり__init__.pyませんinit.py。インポートできるようにするには、階層内の各ディレクトリにディレクトリが含まれていることを確認してください。

編集:私はそれを再現することができました。ディレクトリ構造は次のとおりです。

cesar @ cesar-laptop:/ tmp /asdasd$ツリー
。
`-myapp
    |-__init__.py
    |-モデル
    | |-__init__.py
    | `-models.py
    |-スクリプト
    | |-data.py
    | `-__init__.py
    `-テスト
        |-__init__.py
        `-tests.py

data.py問題を絞り込むために、の最初に次のコードを配置しました。

import sys
import pprint

pprint.pprint(sys.path)

from myapp.models.models import *

OPが示した方法で実行するとdata.py、ImportErrorが発生します。

cesar @ cesar-laptop:/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'、
 -スキップしました-
'/usr/local/lib/python2.6/dist-packages']
トレースバック(最後の最後の呼び出し):
  ファイル"myapp/ scripts / data.py"、6行目、
    myapp.models.modelsからインポート*
ImportError:myapp.models.modelsという名前のモジュールがありません

しかし、この方法は魅力のように機能します。

cesar @ cesar-laptop:/ tmp / asdasd $ python -m myapp.scripts.data
[''、
 '/usr/lib/python2.6'、
 '/usr/lib/python2.6/plat-linux2'、
 '/usr/lib/python2.6/lib-tk'、
 -スキップしました-
'/usr/local/lib/python2.6/dist-packages']

の最初のエントリの違いに注意してくださいsys.path

于 2010-08-21T13:59:04.327 に答える
1

どのように実行していimport.pyますか?その場合、現在の作業ディレクトリは何ですか?

ディレクトリを使用できるようにするには、myappディレクトリがPythonパス上にある必要があります(つまり、にリストされているディレクトリの1つ内にある必要がありsys.pathます)import。Pythonは、インタプリタの起動時に現在の作業ディレクトリをパスリストに自動的に追加します。

したがって、を含むディレクトリがmyapp手動でパスに追加されていない場合(たとえば、PYTHONPATH環境変数を使用する、またはに追加するsys.path) 、スクリプトを実行するときにをsitecustomize.py含むディレクトリにいる必要があります。myappディレクトリ自体の中にいる場合、パッケージmyappをインポートすることはできません。myapp

于 2010-08-21T14:04:25.733 に答える
1

sys.pathテストを実行しているときとスクリプトを実行しているときは、明らかに同じように設定されていません。行う

import sys
print(sys.path)

両方のモジュールの上部にあることを確認します。次に、間違っているものを修正します(欠落している場合は、sys.pathの親ディレクトリに追加します。myapp

于 2010-08-21T14:53:18.863 に答える
0

あなたがそれについて言及するのを忘れない限り、あなたは__init__.pyinmyapp/scriptsを持っていないのでmyapp/scripts/import.py、のモジュールではありませんmyapp

何らかの形でグローバルパスにない限りmyapp、スクリプトは適切な場所でそれを検索しないため、それを見つけることができません。

スクリプトフォルダにを追加してモジュールにするか__init__.py、スクリプトをファイルシステム階層の上位に移動するか(myapp親フォルダ内またはその中に)myapp、パスにインストールします(つまり、packagesフォルダに移動します/usr/lib/python2.6/dist-packages/)。

于 2010-08-21T16:04:39.900 に答える