Python Noseインポートエラー


120

ノーズテストフレームワークに、ファイル構造内のテストスクリプトの下にあるモジュールを認識させることができないようです。問題を示す最も簡単な例を設定しました。以下で説明します。

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

./__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ファイルが空です

私が実行した場合nosetests -vv(foo.pyがある)メインディレクトリに、私が取得します:

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はすべての親パッケージをパスと、それが呼び出されるディレクトリに追加することになっていますが、これは私の場合は発生していないようです。

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

回答:


226

あなたは__init__.pyあなたのトップレベルのディレクトリに持っています。それはそれをパッケージにします。あなたがそれを削除すれば、あなたnosetestsはうまくいくはずです。

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


7
わかった。どうもありがとう!私は賛成票を投じたが、どうやらもっと評判が必要だ。
halfak

4
心配ない。StackOverflowへようこそ!回答で問題が解決した場合は、左側の緑色のチェックマークにチェックマークを付けることができます。
ire_and_curses 2010年

2
@halfak:あなたの質問に別の賛成投票をしてください。あなたも(あなたの答えで)@ire。
Mark Rushakoff、

1
とった。ヒントをありがとう:)
halfak

5
ルートディレクトリでinit .py を実行するとテストが機能する状況がありますが、そのファイルがそこにある必要があり、import models。<model_name>がまだ見つかりません。テストはtests /ディレクトリ内にあり、私がテストしようとしているモデルmodels /ディレクトリ内にあります...どんな助けでもいただければ幸いです。
キースブリッグス

32

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

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

2
私も。ありがとう、多くの時間を節約しました。
jskulski 2015

3
私のためにシステムnosetestsにキャッシュされbashていました/usr/local/binwhich nosetests適切な結果を出している間)。これを使ってクリアしました。
Raffi

5
さらに、virtualenvを非アクティブ化およびアクティブ化する必要がありました。
Bengt

(設定されていない変数のエラーを克服するために)virtualenvをアクティブ化するときに設定されたPS1 = $ {PS1:-}に問題がありました。これを削除してset + uに切り替えた後、問題はもうありませんでした。
Juuso Ohtonen

13

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

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

./tests/
  ./test_some_random_stuff.py

私がnosetestsを実行した場合:

nosetests -w tests

それはImportError他の皆が見ていることを与えるでしょう。空の__init__.pyファイルを追加した場合、問題なく機能します。

./tests/
  ./__init__.py
  ./test_some_random_stuff.py

10

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



1
@アマン、あなたは変数識別子とファイル名の違いを理解していますか?
Nakilon 2013年

ええ...私はいつもFooTests.pyに似たファイルを持っていますが、それは何らかの理由でそれが気に入らなかった...
バードマン

3

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

find . -name '*.pyc' -delete

3

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

ばかげていますが、起こります。


回答にいくつかの詳細を追加できますか?どのディレクトリから実行しましたか?なぜそれが間違っているのですか?適切なディレクトリは何でしょうか?nosetestsテストをまったく行わないディレクトリで実行すると、Ran 0 testsインポートエラーは発生しません。現在の形では、この答えは役に立ちません。
gerrit

2

この問題を引き起こす可能性があるもう1つの問題、フォームでのテストの命名に遭遇しましたtestname.test.py。その余分なもの.は鼻を混乱させ、それがすべきでないものをインポートすることにつながります。型にはまらないテストの命名規則を使用すると問題が解決することは明らかだと思いますが、注目に値するかもしれません。


2

たとえば、次のディレクトリ構造で、あなたが実行したい場合nosetestsm1m2またはm3で一部の機能をテストするためにn.py、あなたは使うべきfrom m2.m3 import nではtest.py

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py

1

質問を完了するだけです:このような構造で苦労している場合:

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ルートのアクティベート内に貼り付けます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.