Derzeit habe ich pyenv
eine bestimmte python
Version installiert. Dann pipenv
erstelle ich virtuelle Umgebungen für meine verschiedenen Projekte in python
.
Derzeit habe ich eine Projektstruktur ähnlich der:
foo/
src/app.py
src/__init__.py
tests/unit/test_app.py
tests/unit/__init_.py
Es gibt eine beliebige Anzahl von Tests, test_app.py
die Folgendes importieren app.py
:
import src.app
Ich habe zwei Probleme:
- Code-Editoren wie oder
emacs
beschweren sich über diese Klausel aus den Tests, markieren sie rot und nennen sie „mäßig“ störend.vim
vscode
import
- Von den Texteditoren aus rufe ich
pipenv run pytest
die Tests auf. Es schlägt fehl, weilsrc
es kein Modul gibt, das gefunden werden kann. Wenn ich denselben Befehl von meinem Terminal im Projektverzeichnis aus aufrufe, erhalte ich denselben Fehler.
Wenn ich es als python
Modul aufrufe pipenv run python -m pytest
, funktioniert es, da es das aktuelle Verzeichnis zu hinzufügt PYTHONPATH
. Wenn ich die Editoren von einem aus starte, pipenv shell
funktionieren die Tests auch. Unabhängig davon, wie ich die Editoren starte, import src.app
wird das als ungültig markiert.
Wenn ich die Editoreinstellungen starte, PYTHONPATH=$PYTHONPATH:.
funktionieren die Tests auch, allerdings beschwert sich die Syntaxprüfung immer noch.
Wie kann ich das am saubersten mit Editoren wie emacs
oder handhaben vim
? Ich möchte nicht auf pycharm
und ähnliche Tools umsteigen, die dieses Problem „automatisch“ lösen.
Antwort1
Gemäß pipenv
Dokumentation wird jede .env
Datei im Verzeichnis pipenv
geladen, aus dem der Aufruf erfolgt.
Dies bedeutet, dass (beispielsweise) wenn Sie während der Verwendung der Ebene test_app.py
in geöffnet haben, die des Projekts (wie üblich) geladen wird, aber auch die automatisch geladen wird und die internen Abhängigkeiten der Datei funktionieren.emacs
python
pipenv
.env
So funktioniert es für mich beispielsweise, wenn ich .env
diesen Inhalt an der Projektstammposition erstelle:
PYTHONPATH=$PYTHONPATH:.
Jetzt können Sie Unit-Tests auch direkt ausführen, emacs
ohne dass es beim Import zu Problemen kommt.
Nur so konnte ich es zum Laufen bringen, allerdings wirkt die Lösung hackig und unelegant.