Wie füge ich PYTHONPATH in virtualenv einen Pfad hinzu?

97

Ich versuche, der Umgebungsvariablen PYTHONPATH einen Pfad hinzuzufügen, der nur in einer bestimmten virtuellen Umgebung sichtbar ist.

Ich habe es SET PYTHONPATH=...unter einer virtualenv-Eingabeaufforderung versucht , aber das legt die Variable für die gesamte Umgebung fest.

Wie erreiche ich das?

Flavien
quelle

Antworten:

155

Sie können normalerweise vermeiden, mit PYTHONPATH etwas zu tun, indem Sie .pthDateien verwenden . Fügen Sie einfach eine Datei mit der Erweiterung .pth (jeder Basisname funktioniert) in den Site-Packages-Ordner Ihres virtualenv ein, z. B. lib\python2.7\site-packagesmit dem absoluten Pfad zu dem Verzeichnis, das Ihr Paket als einzigen Inhalt enthält.

Dougal
quelle
Leider funktioniert dies nicht als Override. Der Pfad wird angehängt. Wenn Sie also entwickeln, funktioniert er nicht.
Erik Aronesty
Wenn Sie den absoluten Pfad kennen, wozu dient eine Variable?
Jamie Marshall
Sie können auch zum Site-Package-Ordner Ihrer virtuellen Umgebung navigieren und einen symbolischen Link zur .pth-Datei wie folgt erstellen: ln -s path / to / somfile.pth. Ich fand dies nützlich, als ich das gleiche Verzeichnis benötigte, um in mehreren virtuellen Umgebungen zugänglich zu sein
Data-phile
91

Wenn Sie verwenden virtualenv, sollten Sie wahrscheinlich auch virtualenvwrapper verwenden . In diesem Fall können Sie den Befehl add2virtualenv verwenden , um dem Python-Pfad für die aktuelle virtualenv Pfade hinzuzufügen:

add2virtualenv directory1 directory2 …

Crimeminister
quelle
3
Wie wäre es mit Entfernen aus virtualenv?
Silberdolch
1
Ich möchte einen freundlichen Kommentar hinzufügen, der auf gemeinsam genutzten Hosts und ähnlichen Situationen nicht erwünscht ist. In solchen Fällen ist ein Venv in Kraft und alles, was für die zusätzliche Installation benötigt wird, ist nicht erwünscht. Lokal sind die Dinge anders, aber auf Server / Image ist KISS wirklich wichtig.
Marc
2
Ich bin nicht sicher, wie der Befehl funktioniert hat, als er geschrieben wurde, aber er add2virtualenvändert $ PYTHONPATH nicht, sondern ändert sys.path.
ForeverWintr
1
@ajostergaard: Entschuldigung, ich hätte eine Quelle angeben sollen. Wenn Sie sich den Quellcode ansehen add2virtualenv, sehen Sie, dass er sys.path ändert. Ich bin damit einverstanden, dass die Dokumente den Eindruck erwecken PYTHONPATH, dass die Umgebungsvariable geändert wird, aber das scheint falsch zu sein. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/…
ForeverWintr
1
@ForeverWintr Ich stehe korrigiert - .pth-Dateien werden verwendet, um sys.path einzurichten. docs.python.org/2/library/site.html Confused.com!
Ostergaard
5

Sie können auch versuchen, einen Symlink zu einer Ihrer virtuellen Umgebungen zu erstellen.

z.B. 1) Aktivieren Sie Ihre virtuelle Umgebung. 2) Führen Sie Python aus. 3) Importieren Sie sys und überprüfen Sie sys.path. 4) Dort finden Sie den Python-Suchpfad. Wählen Sie eines davon aus (z. B. Site-Pakete). 5) Gehen Sie dorthin und erstellen Sie einen Symlink zu Ihrem Paket wie folgt: ln -s Pfad-zu-Ihrem-Paketnamen-mit-dem-Sie-importieren

Auf diese Weise sollten Sie es auch ohne Aktivierung Ihrer virtuellen Umgebung importieren können. Versuchen Sie einfach: Pfad zu Ihrem virtuellen Env-Ordner / bin / python und importieren Sie Ihr Paket.

Slavko-t
quelle
Ich denke, dies wurde für die Verwendung von Symlinks anstelle von .pth-Dateien herabgestimmt. Es hat aber für mich funktioniert, egal wie.
Gareth Davidson
3

Wenn Sie virtualenvwrapper verwenden,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

Konsole wird angezeigt

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

Das war's, und du solltest gut gehen

Aneesh Panoli
quelle
1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Ich empfehle dringend, virtualenv und virtualenvwrapper zu verwenden, um ein Überladen des Pfads zu vermeiden.

Badeente
quelle
Wenn Sie möchten, dass dies mit jeder Python-Version funktioniert, verwenden Sie einfach ein normales String-Format im alten Stil anstelle des ausgefallenen F-Strings f "... {dir_path}"
Guillaume S
Danke für den Kommentar. Ich habe für den Gebrauch überarbeitet. Die alten Wege sind umständlich und eigenwillig und es gibt nichts Besonderes an einem einfachen Templating-System
Rubber Duck
Alles ist relativ :)
Guillaume S