web-dev-qa-db-de.com

pytest kann kein Modul importieren, während Python dies kann

Ich arbeite an einem Paket in Python. Ich benutze Virtualenv. Ich setze den Pfad zum Stammverzeichnis des Moduls in einem .pth-Pfad in meiner virtualenv, sodass ich während der Codeentwicklung Module des Pakets importieren und testen kann (Frage 1: Ist dies eine gute Möglichkeit?). Das funktioniert gut (hier ist ein Beispiel, das ist das Verhalten, das ich möchte):

(VEnvTestRc) [email protected]:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) [email protected]:~/Desktop/GitFolders/rc$ python tests/test_ns.py 
issued command: echo hello
command output: hello

Wenn ich jedoch versuche, PyTest zu verwenden, erhalte ich einige Importfehlermeldungen:

(VEnvTestRc) [email protected]:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile: 
collected 0 items / 1 errors 

================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
    from rc import ns
E   ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) [email protected]:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest

Ich bin etwas verwirrt, es sieht so aus, als würde dies auf einen Importfehler hindeuten, aber Python macht das gut. Warum gibt es ein Problem speziell mit PyTest? Irgendwelche Vorschläge zum Grund/Abhilfemaßnahme (Frage 2)? Ich habe gegoogelt und stapelte den Fehler 'ImportError: kann nicht importieren' für PyTest, aber die Treffer, die ich bekam, waren mit dem fehlenden Python-Pfad und der Lösung dieses Problems verbunden. Irgendwelche Vorschläge?

39
Zorglub29

Antwort gefunden:

Legen Sie eine __init__.py-Datei NICHT in einen Ordner mit TESTS ab, wenn Sie pytest verwenden möchten. Ich hatte eine solche Datei und löschte das Problem.

Dies wurde tatsächlich in den Kommentaren zur zweiten Antwort der PATH-Ausgabe mit pytest 'ImportError: Kein Modul mit dem Namen YadaYadaYada' begraben. Ich habe es also nicht gesehen.

49
Zorglub29

Ich kann nicht sagen, dass ich verstehe, warum dies funktioniert, aber ich hatte das gleiche Problem und die Tests funktionieren gut, wenn ich python -m pytest ausführen.

Ich bin in einer virtuellen Welt, mit pytest auch weltweit verfügbar:

(proj)[email protected] ~/dev/proj$ type -a python
python is /home/tom/.virtualenvs/proj/bin/python
python is /usr/bin/python

(proj)[email protected] ~/dev/proj$ python -V
Python 3.5.2

(proj)[email protected] ~/dev/proj$ type -a pytest
pytest is /home/tom/.virtualenvs/proj/bin/pytest
pytest is /usr/bin/pytest

(proj)[email protected] ~/dev/proj$ pytest --version
This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py
13
Tom

Ich hatte das gleiche Problem, aber aus einem anderen Grund als den genannten:

Ich hatte py.test global installiert, während die Pakete in einer virtuellen Umgebung installiert wurden.

Die Lösung bestand darin, pytest in der virtuellen Umgebung zu installieren. (Falls Ihre Shell ausführbare Dateien enthält, verwenden Sie wie Bash hash -r oder verwenden Sie den vollständigen Pfad zu py.test.)

7
Mark

Ich habe das Problem gelöst, indem ich __init__.py in meinem Projektstamm entfernt habe:

.
├── __init__.py <--- removed
├── models
│   ├── __init__.py
│   ├── address.py
│   ├── appointment.py
│   └── client.py
├── requirements.txt
├── setup.cfg
├── tests
│   ├── __init__.py
│   ├── models
│   │   ├── __init__.py
│   │   ├── appointment_test.py
│   │   └── client_test.py
│   └── other_test.py
└── script.py
4
Aaron McMillin

Dieses Problem tritt auf, wenn Sie eine tests.py-Datei und einen Testordner mit tests/__init__.py haben.

Während der Sammlung findet pytest den Ordner, aber wenn versucht wird, die Testdateien aus dem Ordner zu importieren, verursacht tests.py-Datei das Importproblem.

Um das Problem zu beheben, entfernen Sie einfach die tests.py-Datei und legen Sie alle Ihre Tests in den tests/-Ordner.

Für Ihren speziellen Fall lautet der Fix genau:

  • Entfernen Sie die Datei /home/zz/Desktop/GitFolders/rc/tests.py
  • Stellen Sie sicher, dass /home/zz/Desktop/GitFolders/rc/tests/__init__.py vorhanden ist
3
lucasamaral

Installieren Sie die Pakete in Ihrer virtuellen Umgebung.
Starten Sie dann eine neue Shell und geben Sie Ihre virtuelle Umgebung erneut ein.

2
Kjeld Flarup

In meinem Fall trat der Importfehler auf, weil das Paket auf ein anderes Paket/Verzeichnis mit dem Namen same name verweist und der Pfad eine Ebene über dem Ordner liegt, den ich eigentlich wollte ... Ich denke, das erklärt auch, warum manche Leute dies tun Sie müssen _ init _.py entfernen, während andere sie wieder hinzufügen müssen. 

Ich habe nur print(the_root_package.__path__) (nach import the_root_package) in beide python console und pytest Skripte gestellt, um den Unterschied zu vergleichen.

UNTERE LINIE: Wenn Sie python ausführen, kann das importierte Paket vom Paket abweichen, wenn Sie pytest ausführen. 

2
JoeyZhao

Die obige Antwort funktioniert bei mir nicht. Ich habe es gerade gelöst, indem ich den absoluten Pfad des Moduls, das nicht gefunden wurde, an den sys.path oben auf dem test_xxx.py (Ihrem Testmodul) angehängt habe, wie:

import sys
sys.path.append('path')
1
ZYX

Möglicherweise liest Pytest das Paket nicht als Python-Modul, während Python dies ist (wahrscheinlich aufgrund von Pfadproblemen). Ändern Sie das Verzeichnis des pytest-Skripts oder fügen Sie das Modul explizit zu Ihrem PYTHONPATH hinzu.

Oder es kann sein, dass Sie zwei Versionen von Python auf Ihrem Computer installiert haben. Überprüfen Sie Ihre Python-Quelle auf pytest und auf die Python-Shell, die Sie ausführen. Wenn sie unterschiedlich sind (d. H. Python 2 vs. 3), verwenden Sie source activate, um sicherzustellen, dass Sie den pytest ausführen, der für denselben Python installiert ist, in dem das Modul installiert ist.

0
tooty44

Hatte ein ähnliches Problem und es funktionierte, als ich init. Py-Datei im Testverzeichnis hinzufügte.

0

Wenn es sich um python Code handelt, der ursprünglich in python 2.7 entwickelt und jetzt in python 3.x migriert wurde, liegt das Problem wahrscheinlich an einem Importproblem .

z.B. Beim Importieren eines Objekts aus einer Datei: base, das sich im selben Verzeichnis befindet, funktioniert dies in python 2.x:

from base import MyClass

in python 3.x sollten Sie durch base full path oder .base ersetzen, wenn Sie dies nicht tun, wird dies das obige Problem verursachen. also versuche:

from .base import MyClass
0
Amit Talmor

Ich hatte ein ähnliches Problem, genau denselben Fehler, aber eine andere Ursache. Ich habe den Testcode gut laufen lassen, aber gegen eine alte Version des Moduls. In der vorherigen Version meines Codes existierte eine Klasse, die andere nicht. Nach der Aktualisierung meines Codes hätte ich Folgendes ausführen müssen, um ihn zu installieren.

Sudo pip install ./ --upgrade

Bei der Installation des aktualisierten Moduls lieferte pytest die korrekten Ergebnisse (da ich die korrekte Codebasis verwendete).

0
Procyclinsur

Wenn Sie bereits über .pyc-Dateien verfügen, versuchen Sie, diese zu löschen.

Heute stoße ich auf dieses Problem, hier ist was passiert:

zuerst führe ich pytest in mac aus (dies erzeugt pyc-Dateien), dann starte ich einen Docker-Container (das Betriebssystem ist Alpine) mit eingebundenem Projektverzeichnis. Wenn ich dann versuche, pytest in container auszuführen, passiert ImportError. nachdem alle pyc dateien gesäubert wurden, tritt kein fehler mehr auf.

Hoffe das kann hilfreich sein.

0
接口夏季

Für alle, die alles versucht haben und trotzdem Fehler bekommen, habe ich eine Lösung parat.

Wechseln Sie im Ordner in dem pytest installiert ist zum Ordner pytest-env.

Öffnen Sie die Datei pyvenv.cfg.

In der Datei ändere include-system-site-packages von false nach true.

home = /usr/bin
include-system-site-packages = true
version = 3.6.6

Hoffe, es funktioniert. Vergessen Sie nicht, Ihre Stimme zu erhöhen.

0
Charan Reddy

Noch ein Sonderfall:

Ich hatte das Problem mit Tox. Mein Programm lief also einwandfrei, aber Unittests via tox beschwerten sich ständig. Nach der Installation der Pakete (die für das Programm benötigt werden) müssen Sie zusätzlich die in den unittests verwendeten Pakete in der tox.ini angeben 

[testenv]
deps =
    package1
    package2 
...
0
martin.zaenker