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.
/projects/my_project
und was ist/apis
? Sind sie Verzeichnisse oder Symlinks? Wie hängen sie miteinander zusammen?Antworten:
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.
quelle
.dockerignore
Datei 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.__pycache__
im Verzeichnis der Datei befinden, in der dieser Fehler gemeldet wurde. Vielen Dank.find . \( -name '__pycache__' -or -name '*.pyc' \) -delete
build
Ordner auch zum.dockerignore
Mit der .dockerignore- Datei können Sie alle
__pycache__
Ordner vom Senden an den Docker-Image-Kontext ausschließen:.dockerignore
Datei, schließt__pycache__
Ordner und*.pyc
Dateien aus allen Unterordnern aus:quelle
/.venv
oder ähnliches.Löschen Sie alle .pyc-Dateien. Sie können dies tun, indem Sie
find . -name \*.pyc -delete
quelle
Ich benutze Python 3.6. In meinem Fall habe ich
ImportMismatchError
Module mit demselben Namen unter verschiedenen Paketen erhalten, z . B.A/B/main.py
undC/D/main.py
. Python 3 benötigt keine__init__.py
Datei in Quellordnern, sondern fügt__init__.py
unter hinzuA/B
undC/D
behebt das Problem.quelle
__init__.py
Problem behoben hat. Ich versuche zu verstehen ...__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.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.quelle
Gefundene
__pycache__
Dateien in Coverage / Fullcoverage / die injupyter notebook
etc. versteckt sind .Navigieren Sie einfach zum Ordner und verwenden Sie
rm -r __pyache__/
. Dies wird sich um Ihren Pytest kümmern.quelle