Ich arbeite an einem Paket in Python. Ich benutze virtualenv. Ich habe den Pfad zum Stammverzeichnis des Moduls in einem .pth-Pfad in meiner virtuellen Umgebung festgelegt, damit ich während der Entwicklung des Codes Module des Pakets importieren und Tests durchführen kann (Frage 1: Ist dies eine gute Möglichkeit?). Dies funktioniert gut (hier ist ein Beispiel, dies ist das Verhalten, das ich möchte):
(VEnvTestRc) zz@zz:~/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) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py
issued command: echo hello
command output: hello
Wenn ich jedoch versuche, PyTest zu verwenden, werden einige Importfehlermeldungen angezeigt:
(VEnvTestRc) zz@zz:~/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) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest
Ich bin ein bisschen verwirrt, es sieht so aus, als würde dies auf einen Importfehler hinweisen, aber Python macht es gut. Warum gibt es speziell bei PyTest ein Problem? Irgendein Vorschlag zum Grund / zur Abhilfe (Frage 2)? Ich habe den Fehler 'ImportError: Kann nicht importieren' für PyTest gegoogelt und gestapelt, aber die Treffer, die ich erhalten habe, standen im Zusammenhang mit dem fehlenden Python-Pfad und der Behebung dieses Problems, was hier nicht das Problem zu sein scheint. Irgendwelche Vorschläge?
Ich kann nicht sagen, dass ich verstehe, warum das funktioniert, aber ich hatte das gleiche Problem und die Tests funktionieren gut, wenn ich laufe
python -m pytest
.Ich bin in einer virtuellen Umgebung, mit Pytest auch weltweit verfügbar:
quelle
python -m pytest [...]
"auch das aktuelle Verzeichnis hinzugefügt wirdsys.path
".python3 -m pytest
PYTHONPATH=.:./src pytest
als Make-Ziel.Ich habe dies gerade gelöst, indem ich die Datei __init__.py in meinem Projektstamm entfernt habe:
quelle
__init__.py file in a folder containing TESTS
hat mein Problem nicht gelöst. Dieser hat funktioniert. Ich denke, das liegt an der Dateihierarchie.__init__.py
Datei entfernt . Ich hatte immer noch Probleme. Das Hinzufügen der Datei conftest.py zum Stammverzeichnis hat bei mir funktioniert.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 . (Wenn Ihre Shell wie Bash ausführbare Dateien hascht, verwenden Siehash -r
oder verwenden Sie den vollständigen Pfad zupy.test
)quelle
pytest
die von erstellte virtuelle Umgebung hinzuzufügenconda
,pytest
sie ist jedoch in der Root-Umgebung von anaconda verfügbar. Daher konnte pytest gefunden werden, jedoch kein in der Umgebung installiertes Paket.pip3 install pytest
Innerhalb von virtualenv wurde das Problem behoben.Dieses Problem tritt auf, wenn Sie eine
tests.py
Datei und einen Testordner mit habentests/__init__.py
.Während der Sammlung findet pytest den Ordner, aber wenn versucht wird, die Testdateien aus dem Ordner zu importieren,
tests.py
verursacht die Datei das Importproblem.Um dies zu beheben, entfernen Sie einfach die
tests.py
Datei und legen Sie alle Ihre Tests in dentests/
Ordner.Für Ihren speziellen Fall ist die Lösung genau:
/home/zz/Desktop/GitFolders/rc/tests.py
/home/zz/Desktop/GitFolders/rc/tests/__init__.py
vorhanden istquelle
Ich hatte ein ähnliches Problem, genau den gleichen Fehler, aber eine andere Ursache. Ich habe den Testcode einwandfrei ausgeführt, aber gegen eine alte Version des Moduls. In der vorherigen Version meines Codes existierte eine Klasse, die andere nicht. Nach dem Aktualisieren meines Codes hätte ich Folgendes ausführen müssen, um ihn zu installieren.
sudo pip install ./ --upgrade
Bei der Installation des aktualisierten Moduls führte pytest zu den richtigen Ergebnissen (da ich die richtige Codebasis verwendete).
quelle
pip install ./ --upgrade
die installierte Version der Bibliothek mit dem neuesten Code aktualisiert und pytest aktiviert, um auch diese neueste Version zu finden.In meinem Fall ist der Importfehler aufgetreten, weil das Paket auf ein anderes Paket / Verzeichnis mit demselben Namen verweist und sein Pfad eine Ebene über dem Ordner liegt, den ich eigentlich wollte. Ich denke, dies erklärt auch, warum einige Leute _ init _.py entfernen müssen, während andere wieder hinzufügen müssen.
Ich habe nur
print(the_root_package.__path__)
(nachimport the_root_package
) sowohl in diepython
Konsole als auch in diepytest
Skripte eingefügt, um den Unterschied zu vergleichenBOTTOM LINE: Wenn Sie dies tun
python
, unterscheidet sich das von Ihnen importierte Paket möglicherweise von dem Paket, das Sie ausführenpytest
.quelle
Installieren Sie die Pakete in Ihrer virtuellen Umgebung.
Starten Sie dann eine neue Shell und geben Sie Ihre virtuelle Umgebung erneut ein.
quelle
Die obige Antwort funktioniert bei mir nicht. Ich habe es gerade gelöst, indem ich den absoluten Pfad des Moduls angehängt habe, der nicht
sys.path
oben auf demtest_xxx.py
(Ihrem Testmodul) gefunden wurde, wie:quelle
test_main.py
, habe ich sieconftest.py
in mein Testverzeichnis gestellt und es hat funktioniert. Vielen Dank für die Bereitstellung einer programmatischen Lösung anstelle von Dateimüll.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.
Beispiel: Wenn Sie ein Objekt aus einer Datei importieren
base
, die sich im selben Verzeichnis befindet, funktioniert dies in Python 2.x:In Python 3.x sollten Sie den
base
Pfad durch den vollständigen Pfad ersetzen..base
Andernfalls wird das oben genannte Problem verursacht. also versuche:quelle
Ich habe dieses Problem heute festgestellt und es gelöst, indem ich
python -m pytest
aus dem Stammverzeichnis meines Projektverzeichnisses aufgerufen habe.Das Anrufen
pytest
vom selben Standort aus verursachte immer noch Probleme.Mein Projektverzeichnis ist wie folgt organisiert:
Das Modul
routes
wurde in mein importierttest_routes.py
als:from server.routes.routes import Routes
Hoffentlich hilft das!
quelle
Ein weiterer Sonderfall:
Ich hatte das Problem mit Tox. Mein Programm lief also gut, aber Unittests über Tox beschwerten sich immer wieder. Nach der Installation der Pakete (für das Programm erforderlich) müssen Sie zusätzlich die Pakete angeben, die in den Unittests in der tox.ini verwendet werden
quelle
Hatte ein ähnliches Problem und es funktionierte, als ich die Datei init .py im Testverzeichnis hinzufügte .
quelle
Ich habe das mit VSCode bekommen. Ich habe eine Conda-Umgebung. Ich glaube nicht, dass die VScode-Python-Erweiterung die von mir vorgenommenen Aktualisierungen sehen kann.
Ich musste rennen
pip install ./ --upgrade
quelle
Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Bearbeiten Sie Ihre Datei conftest.py und fügen Sie folgende Codezeilen hinzu:
Wenn Sie versuchen, den Testfall über das Terminal auszuführen, verwenden Sie Folgendes Beispiel:
quelle
NameError: name 'file' is not defined
- Womit sollte die Datei gleich sein?Ein weiterer großer Gewinn für Pythons Importsystem. Ich denke, der Grund, warum es keinen Konsens gibt, ist, dass das, was funktioniert, wahrscheinlich von Ihrer Umgebung und den Tools abhängt, die Sie darüber hinaus verwenden.
Ich verwende dies von VS Code im Test-Explorer unter Windows in einer Conda-Umgebung, Python 3.8.
Das Setup, an dem ich arbeiten muss, ist:
Unter diesem Setup funktioniert Intellisense und die Testerkennung.
Beachten Sie, dass ich ursprünglich Folgendes versucht habe, wie hier empfohlen .
Ich konnte keine Möglichkeit finden, dies mit VS Code zum
src
Laufen zu bringen, da der Ordner das Importsystem einfach umgehauen hat. Ich kann mir vorstellen, dass es eine Möglichkeit gibt, dies über die Befehlszeile zum Laufen zu bringen. Als relativ neue Konvertierung in die Python-Programmierung habe ich das nostalgische Gefühl, mit COM zu arbeiten, aber etwas weniger Spaß zu haben.quelle
Habe alles gleich gehalten und gerade eine leere Testdatei im Stammordner hinzugefügt. Es wurde behoben
Hier sind die Ergebnisse, dieses Problem hat mich eine Weile wirklich nervt. Meine Ordnerstruktur war
und pytest würde sich beim ModuleNotFoundError beschweren und den Hinweis geben - stellen Sie sicher, dass Ihre Testmodule / -pakete gültige Python-Namen haben.
Ich habe eine Mock-Testdatei auf der gleichen Ebene wie Mathsapp und das Testverzeichnis eingeführt. Die Datei enthielt nichts. Jetzt beschwert sich pytest nicht.
Ergebnis ohne die Datei
Ergebnisse mit der Datei
quelle
Ich habe mein Problem gelöst, indem ich die
PYTHONPATH
Umgebungsvariablen für die spezifische Konfiguration festgelegt habe, mit der ich meine Tests ausführe.Während Sie die Testdatei auf PyCharm anzeigen:
Ctrl
+Shift
+A
Edit Configurations
PYTHONPATH
unter Umgebung> Umgebungsvariablen ein.quelle
Es kann sein, dass Pytest das Paket nicht als Python-Modul liest, während Python dies ist (wahrscheinlich aufgrund von Pfadproblemen). Versuchen Sie, das Verzeichnis des Pytest-Skripts zu ändern oder das Modul explizit zu Ihrem PYTHONPATH hinzuzufügen.
Oder Sie haben möglicherweise zwei Versionen von Python auf Ihrem Computer installiert. Überprüfen Sie Ihre Python-Quelle auf pytest und die von Ihnen ausgeführte Python-Shell. Wenn sie unterschiedlich sind (z. B. Python 2 vs 3),
source activate
stellen Sie mit sicher, dass Sie den installierten Pytest für denselben Python ausführen, in dem das Modul installiert ist.quelle
Für alle, die alles versucht haben und trotzdem Fehler bekommen, habe ich eine Lösung.
Wechseln Sie in dem Ordner, in dem pytest installiert ist, zum Ordner pytest-env .
Öffnen Sie die Datei pyvenv.cfg .
Ändern Sie in der Datei include-system-site-packages von false in true .
Hoffe, es funktioniert. Vergessen Sie nicht, die Abstimmung zu verbessern.
quelle
Wenn Sie bereits .pyc-Dateien haben, versuchen Sie, diese zu löschen.
Heute stoße ich auf dieses Problem. Folgendes ist passiert:
Zuerst starte ich pytest auf einem Mac (dadurch werden pyc-Dateien generiert), dann starte ich einen Docker-Container (das Betriebssystem ist alpin) mit gemountetem Projektverzeichnis. Wenn ich dann versuche, pytest in container auszuführen, passiert ImportError. nach dem bereinigen aller pyc dateien kein fehler mehr.
Hoffe das kann hilfreich sein.
quelle
Wenn Sie eine Notwendigkeit init .py - Datei in Ihrem Ordner erstellen Sie eine Kopie des Ordners und löschen init .py , daß man Ihre Tests ausführen es für lokale Projekte arbeitet. Wenn Sie den Test regelmäßig ausführen müssen, prüfen Sie, ob Sie Ihre init .py in eine separate Datei verschieben können.
quelle
[Gelöst] Bevor
__init__.py
wir direkt auf die Lösung zum Entfernen / Hinzufügen eingehen , möchten wir möglicherweise auch untersuchen, wie die Importe in Ihren Klassen durchgeführt wurden. Eigentlich habe ich einen Tag damit verloren, nur daran zu__init__.py
denken, dass das das Problem sein könnte :) Das war jedoch ziemlich informativ.In meinem Fall war es die falsche Art, Klassen von einer Python-Klasse zu einer anderen Python-Klasse aufzurufen, die geworfen wurde
ImportError
. Die Art und Weise, wie Klassen / Module aufgerufen werden, wurde korrigiert und es funktionierte wie ein Zauber. Hoffe, das hilft auch anderen.Und ja, für ähnliche Fehler haben wir möglicherweise unterschiedliche Lösungen, je nachdem, wie der Code geschrieben ist. Besser mehr Zeit für das Selbst-Debuggen aufwenden. Lektion gelernt :) Viel Spaß beim Codieren !!!
quelle
Meine 2 Cent dazu: pytest schlägt zufällig fehl, wenn Sie keine virtuellen Umgebungen verwenden. Manchmal funktioniert es einfach, manchmal nicht.
Daher lautet die Lösung:
Der Code unter Windows PowerShell:
Dann endlich
Ein Beispiel für setup.py für pip install -e:
quelle
Ich bin mit den Beiträgen nicht einverstanden, die besagen, dass Sie alle
__init__.py
Dateien entfernen müssen . Was Sie stattdessen tun müssen, ist das zu ändernsys.path
.Führen Sie ein Experiment aus, bei dem Sie drucken,
sys.path
wenn Sie den Code normal ausführen. Drucken Sie dann,sys.path
während Sie den Code über pytest ausführen. Ich denke, Sie werden feststellen, dass es einen Unterschied zwischen diesen beiden Pfaden gibt, weshalb der Pytest bricht.Um dies zu beheben, fügen Sie den Pfad aus dem ersten Experiment am 0. Index des zweiten ein.
Sei
'/usr/exampleUser/Documents/foo'
das erste Element vonprint(sys.path)
für Experiment 1.Unten finden Sie Code, mit dem Sie Ihr Problem beheben können:
import sys sys.path[0] = '/usr/exampleUser/Documents/foo'
Fügen Sie dies vor Ihrer eigentlichen Importanweisung oben in Ihre Datei ein.
Quelle: Ich habe mich selbst damit befasst und der obige Prozess hat es gelöst.
quelle
Legen Sie einfach eine leere
conftest.py
Datei im Projektstammverzeichnis ab, da beimpytest
Erkennen einer conftest.py die Datei sys.path geändert wird, sodass Inhalte aus demconftest
Modul importiert werden können. Eine allgemeine Verzeichnisstruktur kann sein:quelle
Ich hatte alle meine Tests in einem Testordner abgelegt und bekam den gleichen Fehler. Ich habe dieses Problem gelöst, indem ich eine init .py in diesen Ordner eingefügt habe:
. | - Pipfile | - Pipfile.lock | - README.md | - api | - app.py | - config.py | - migrations | - pull_request_template.md | - settings.py
-- tests |-- __init__.py <------ |-- conftest.py
- test_sample.pyquelle