Fehler erhalten ImportMismatchError beim Ausführen von py.test

72

Wenn ich Tests lokal ausführe, funktioniert es einwandfrei, aber nachdem ich den Docker erstellt und im Container ausgeführt habe, wird der folgende Fehler angezeigt.

    /usr/local/lib/python3.5/site-packages/_pytest/config.py:325: in _getconftestmodules
    return self._path2confmods[path]
E   KeyError: local('/apis/db/tests')

During handling of the above exception, another exception occurred:
/usr/local/lib/python3.5/site-packages/_pytest/config.py:356: in _importconftest
    return self._conftestpath2mod[conftestpath]
E   KeyError: local('/apis/db/tests/conftest.py')

During handling of the above exception, another exception occurred:
/usr/local/lib/python3.5/site-packages/_pytest/config.py:362: in _importconftest
    mod = conftestpath.pyimport()
/usr/local/lib/python3.5/site-packages/py/_path/local.py:680: in pyimport
    raise self.ImportMismatchError(modname, modfile, self)

_pytest.config.ConftestImportFailure: ImportMismatchError('conftest', '/projects/my_project/db/tests/conftest.py', local('/apis/db/tests/conftest.py'))

/ apis - es ist das WORKDIR in Dockerfile.

AJ
quelle
Sie haben wahrscheinlich einige Probleme mit Python-Importpfaden oder mit Symlinks oder was auch immer. Was ist /projects/my_projectund was ist /apis? Sind sie Verzeichnisse oder Symlinks? Wie hängen sie miteinander zusammen?
MarSoft
@MarSoft / projects befindet sich im Home-Verzeichnis und / apis im Docker-Home-Verzeichnis. Übrigens habe ich das Problem gelöst. Vielen Dank!
AJ

Antworten:

131

Ich habe das Problem behoben, indem ich alle __pycache__ -Pakete unter test / directory entfernt habe. Das Problem war, dass beim Erstellen eines Docker-Images auch alle meine __pycache__- und * .pyc- Dateien ausgewählt wurden, während der Test ausgeführt wird und nicht mein lokaler Computerpfad der Pfad im Docker-Container.

Fazit: Löschen Sie Ihre * .pyc- und __pycache__- Dateien, bevor Sie ein Docker-Image erstellen.

AJ
quelle
14
Sie können diese Einträge so in Ihre .dockerignoreDatei einfügen, dass sie während der Erstellungsphase ignoriert werden. Sie werden jedoch immer noch abgerufen, wenn Sie Ihre Quellordner in den Container einbinden, um Tests unter Einbeziehung lokaler Änderungen auszuführen.
Giorgiosironi
Um dieses Problem zu beheben, musste ich mich __pycache__im Verzeichnis der Datei befinden, in der dieser Fehler gemeldet wurde. Vielen Dank.
h3xh4wk
6
Unix-Befehl:find . \( -name '__pycache__' -or -name '*.pyc' \) -delete
Bitoffdev
Für meinen Anwendungsfall musste ich den buildOrdner auch zum.dockerignore
CNugteren
34

Mit der .dockerignore- Datei können Sie alle __pycache__Ordner vom Senden an den Docker-Image-Kontext ausschließen:

.dockerignoreDatei, schließt __pycache__Ordner und *.pycDateien aus allen Unterordnern aus:

**/__pycache__
**/*.pyc
Datageek
quelle
1
Auch jede virtuelle Umgebung /.venvoder ähnliches.
Danielle Madeley
12

Löschen Sie alle .pyc-Dateien. Sie können dies tun, indem Sie find . -name \*.pyc -delete

Abhilash
quelle
2
Dies ist im Wesentlichen ein Umschreiben der Antwort von @ AJ. Wie stirbt dieser Mehrwert für die OP-Frage?
Tedinoz
2
@ Tedinoz Es ist ein Kinderspiel, Sie können kopieren und einfügen, um das Problem zu beheben. Ob es Ihnen gefällt oder nicht, viele Menschen sind einfach mit einer Lösung zufrieden und möchten den Hintergrund nicht verstehen.
Poroszd
10

Ich benutze Python 3.6. In meinem Fall habe ich ImportMismatchErrorModule mit demselben Namen unter verschiedenen Paketen erhalten, z . B. A/B/main.pyund C/D/main.py. Python 3 benötigt keine __init__.pyDatei in Quellordnern, sondern fügt __init__.pyunter hinzu A/Bund C/Dbehebt das Problem.

amit
quelle
Ich habe das gleiche Problem und Ihre Antwort hat es auch für mich gelöst. Ich frage mich, warum das Hinzufügen das __init__.pyProblem behoben hat. Ich versuche zu verstehen ...
Newskooler
2
@Newskooler Wenn Sie eine __init__Datei hinzufügen, wird Python über den absoluten Pfad zu jeder Datei im Baum informiert. Ohne diese wissen Sie nicht, auf welche Sie sich beziehen, wenn Sie zwei verschiedene Dateien haben, die in verschiedenen Ordnern gleich benannt sind.
Avazula
1
Okay, im Wesentlichen, obwohl "Python 3 nicht init .py benötigt", erfordert es es irgendwie, wenn Sie möchten, dass es richtig ausgeführt wird?
Newskooler
7

Sie können eine Umgebungsvariable festlegen PY_IGNORE_IMPORTMISMATCH=1, um diese Fehler zu überspringen. In einfachen Fällen wie dem Ausführen von Tests innerhalb und außerhalb des Docker-Containers sollte dies in Ordnung sein.

monitorius
quelle
2

Gefundene __pycache__Dateien in Coverage / Fullcoverage / die in jupyter notebooketc. versteckt sind .

Navigieren Sie einfach zum Ordner und verwenden Sie rm -r __pyache__/. Dies wird sich um Ihren Pytest kümmern.

Harry_pb
quelle