web-dev-qa-db-ja.com

Python鼻インポートエラー

nose testing framework を取得して、ファイル構造内のテストスクリプトの下にあるモジュールを認識できないようです。問題を示す最も単純な例を設定しました。以下で説明します。

パッケージファイルの構造は次のとおりです。

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py

foo.pyの内容:

def dumb_true():
    return True

tests/test_foo.pyの内容:

import foo

def test_foo():
    assert foo.dumb_true()

両方のinit。pyファイルは空です

メインディレクトリ(foo.pyがある場所)でnosetests -vvを実行すると、次の結果が得られます。

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
    import foo
ImportError: No module named foo

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

Tests /ディレクトリ内から実行すると、同じエラーが発生します。ドキュメントと によると、noseはすべての親パッケージをパスとそれが呼び出されたディレクトリに追加することになっていますが、これは私の中で起こっていないようです場合。

私はUbuntu 8.04をPython 2.6.2で実行しています。それが重要な場合は、手動で(setup_toolsではなく)noseをビルドしてインストールしました。

117
halfak

最上位ディレクトリに__init__.pyがあります。それがパッケージになります。削除すると、nosetestsが機能するはずです。

削除しない場合は、importimport dir.fooに変更する必要があります。ここで、dirはディレクトリの名前です。

217
ire_and_curses

あなたはvirtualenvにいますか?私の場合、nosetests/usr/bin/nosetestsにあり、/usr/bin/pythonを使用していました。 virtualenvのパッケージは間違いなくシステムパスに含まれません。以下はこれを修正しました:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
31
toppur

後でこの質問を見つけた方へ:テストディレクトリに__init__.pyファイルがない場合、インポートエラーが発生します。

私のディレクトリ構造は次のようなものでした:

./tests/
  ./test_some_random_stuff.py

鼻テストを実行した場合:

nosetests -w tests

他の人が見ているImportErrorを提供します。空の__init__.pyファイルを追加すると、うまく機能します。

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
12
robbrit

別の潜在的な問題は、ディレクトリツリーのハイフン/ダッシュのようです。最近、ディレクトリの名前をsub-dirからsub_dirに変更して、nose ImportErrorの問題を修正しました。

10
Aron Ahmadia

間違ったディレクトリからnosetestsコマンドを実行したため、このエラーメッセージが表示されました。

愚かな、しかし起こる。

3
Eyal Levin

もちろん、インポートされるモジュールに構文エラーがあり、これが発生する場合。私にとっては、tests.pyと同じディレクトリにmodule/tests.bak.pyのようなパスを持つテストファイルのバックアップがあると、問題は頭をよぎりました。また、Djangoアプリでinitパッケージ/モジュールの問題に対処するには、次の(bash/OSXシェルで)を実行して、 'init。pycファイルが存在しない:

find . -name '*.pyc' -delete
3
hobs

この問題を引き起こす可能性のあるもう1つの問題に遭遇しました:testname.test.pyという形式のテストの命名。余分な.は鼻を混乱させ、本来すべきでないものをインポートすることにつながります。型にはまらないテスト命名規則を使用すると事態が悪化することは明らかであると思われますが、注意する価値があると思いました。

2
7yl4r

たとえば、次のディレクトリ構造で、m1m2、またはm3nosetestsを実行してn.pyの一部の関数をテストする場合は、 from m2.m3 import ntest.pyを使用する必要があります。

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py
2
Che-Hsun Liu

質問を完了するために:このような構造に苦労している場合:

project
├── m1
├    ├── __init__.py
├    ├── foo1.py
├    └──m2
├       ├── __init__.py
├       └── foo2.py
├
└── test
     ├── __init__.py
     └── test.py

また、プロジェクトの外部のパスからテストを実行したい場合は、プロジェクトパスをPYTHONPATHに含めます。

export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project

.profile内に貼り付けます。仮想環境下にいる場合は、venvルートのactivate内に貼り付けます

1
Rainelz