Python Nose Importfehler

120

Ich kann das Nasentest-Framework anscheinend nicht dazu bringen , Module unter meinem Testskript in der Dateistruktur zu erkennen. Ich habe das einfachste Beispiel erstellt, das das Problem demonstriert. Ich werde es unten erklären.

Hier ist die Struktur der Paketdatei:

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

foo.py enthält:

def dumb_true():
    return True

tests / test_foo.py enthält:

import foo

def test_foo():
    assert foo.dumb_true()

Beide init .py-Dateien sind leer

Wenn ich nosetests -vvim Hauptverzeichnis (wo foo.py ist) laufe, bekomme ich:

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)

Ich erhalte den gleichen Fehler, wenn ich aus dem Verzeichnis tests / heraus laufe. Gemäß der Dokumentation und einem Beispiel, das ich gefunden habe, soll nas alle übergeordneten Pakete zum Pfad sowie zu dem Verzeichnis hinzufügen, aus dem es aufgerufen wird, aber dies scheint in meinem Fall nicht zu geschehen.

Ich verwende Ubuntu 8.04 mit Python 2.6.2. Ich habe die Nase manuell gebaut und installiert (nicht mit setup_tools), wenn das wichtig ist.

Halfak
quelle

Antworten:

225

Sie haben eine __init__.pyin Ihrem obersten Verzeichnis. Das macht es zu einem Paket. Wenn Sie es entfernen, nosetestssollte es funktionieren.

Wenn Sie es nicht entfernen, müssen Sie Ihr importin ändern import dir.foo, wo dirist der Name Ihres Verzeichnisses.

ire_and_curses
quelle
7
Das hat es verstanden. Vielen Dank! Ich würde abstimmen, aber anscheinend brauche ich mehr Ruf.
Halfak
4
Keine Sorge. Willkommen bei StackOverflow! Sie können das grüne Häkchen links ankreuzen, wenn die Antwort Ihr Problem löst.
ire_and_curses
2
@halfak: Habe dann noch eine Gegenstimme zu deiner Frage. Sie auch (auf Ihre Antwort), @ire.
Mark Rushakoff
1
Verstanden. Danke für den Tipp :)
Halfak
5
Ich habe eine Situation , wo Tests funktionieren , wenn init in Stammverzeichnis .py - aber ich brauche diese Datei dort zu sein, und Import - Modelle <model_name>. Noch nicht gefunden wird. Test befindet sich in einem tests / -Verzeichnis, und das Modell, das ich testen möchte, befindet sich in models / directory. Jede Hilfe wäre willkommen.
Kees Briggs
32

Bist du in einer virtuellen Umgebung? In meinem Fall nosetestswar derjenige in /usr/bin/nosetests, der verwendet wurde /usr/bin/python. Die Pakete in der virtuellen Umgebung befinden sich definitiv nicht im Systempfad. Folgendes hat dies behoben:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
toppur
quelle
2
Auch meins. Vielen Dank, viel Zeit gespart.
Jskulski
3
für mich nosetestswurde von bashdem system eins in zwischengespeichert /usr/local/bin(während which nosetestsdas richtige ergebnis gegeben wurde). Früher habe ich dies um es zu löschen.
Raffi
5
Außerdem musste ich meine virtuelle Umgebung deaktivieren und aktivieren.
Bengt
Ich hatte ein Problem mit PS1 = $ {PS1: -} beim Aktivieren von virtualenv (um Fehler bei nicht gesetzten Variablen zu überwinden). Nachdem ich dies entfernt und zu set + u gewechselt hatte, hatte ich keine Probleme mehr.
Juuso Ohtonen
13

Für diejenigen unter Ihnen, die diese Frage später finden: Ich erhalte den Importfehler, wenn ich keine __init__.pyDatei in meinem Testverzeichnis habe.

Meine Verzeichnisstruktur war wie folgt:

./tests/
  ./test_some_random_stuff.py

Wenn ich Nasentests durchgeführt habe:

nosetests -w tests

Es würde das geben ImportError, was alle anderen sehen. Wenn ich eine leere __init__.pyDatei hinzufüge , funktioniert das einwandfrei:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
robbrit
quelle
10

Ein weiteres potenzielles Problem scheinen Bindestriche / Bindestriche im Verzeichnisbaum zu sein. Ich habe kürzlich ein Problem mit dem ImportError behoben, indem ich ein Verzeichnis von sub-dirnach umbenannt habe sub_dir.

Aron Ahmadia
quelle
1
@Aman, erkennen Sie den Unterschied zwischen Variablenkennungen und Dateinamen?
Nakilon
Ja ... ich habe immer eine Datei, die FooTests.py ähnlich war und die mir aus irgendeinem Grund nicht gefallen hat ... Ich habe sie in Foo_Tests.py umbenannt und es hat funktioniert ... scheint ein bisschen pingelig zu sein.
Birdman
3

Natürlich, wenn Sie einen Syntaxfehler im zu importierenden Modul haben, der dies verursacht. Für mich hat sich das Problem bemerkbar gemacht, als ich eine Sicherungskopie einer Testdatei mit einem Pfad wie module / tests.bak.py im selben Verzeichnis wie tests.py hatte. Um das Problem mit dem Init- Paket / Modul in einer Django-App zu beheben, können Sie Folgendes ausführen (in einer Bash / OSX-Shell), um sicherzustellen, dass keine Init- Pyc-Dateien herumliegen:

find . -name '*.pyc' -delete
Kochfelder
quelle
3

Ich habe diese Fehlermeldung erhalten, weil ich das ausführe nosetests Befehl aus dem falschen Verzeichnis ausgeführt habe.

Dumm, aber passiert.

Eyal Levin
quelle
Können Sie Ihrer Antwort bitte einige Details hinzufügen? Aus welchem ​​Verzeichnis haben Sie es ausgeführt? Warum ist es falsch? Was wäre das richtige Verzeichnis? Das Ausführen nosetestsin einem Verzeichnis ohne Tests führt zu Ran 0 testskeinem Importfehler. In der gegenwärtigen Form ist diese Antwort nicht nützlich.
Gerrit
2

Ich bin nur auf eine weitere Sache gestoßen, die dieses Problem verursachen könnte: die Benennung von Tests im Formular testname.test.py. Dieses Extra .verwirrt die Nase und führt dazu, dass Dinge importiert werden, die es nicht sollte. Ich nehme an, es mag offensichtlich sein, dass die Verwendung unkonventioneller Namenskonventionen für Tests die Dinge kaputt macht, aber ich dachte, es könnte erwähnenswert sein.

7yl4r
quelle
2

Zum Beispiel mit der folgenden Verzeichnisstruktur, wenn Sie wollen laufen nosetestsin m1, m2oder auf m3bestimmte Funktionen zu testen n.py, die Sie verwenden sollen from m2.m3 import nin test.py.

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

Nur um die Frage zu beantworten: Wenn Sie mit einer Struktur wie dieser zu kämpfen haben:

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

└── test
     ├── __init__.py
     └── test.py

Und vielleicht möchten Sie den Test von einem Pfad außerhalb des Projekts aus ausführen und Ihren Projektpfad in Ihren PYTHONPATH aufnehmen.

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

Fügen Sie es in Ihr .profile ein. Wenn Sie sich in einer virtuellen Umgebung befinden, fügen Sie sie in die Aktivierung in Ihrer venv-Wurzel ein

Rainelz
quelle