Wie kann der Standard-PYTHONPATH (sys.path) global geändert werden?

33

Auf einem Ubuntu (10.10) -System habe ich ein Python-Paket, in das ich mich selbst installiere /usr/local/lib/python2.6/site-packages/. Dies ist nicht im Standardpfad (sys.path) enthalten. Wie füge ich dieses Verzeichnis dem Pfad hinzu?

Das Setzen der $PYTHONPATHUmgebungsvariablen ist natürlich eine Lösung, aber ich suche nach einer eleganteren Möglichkeit, dies zu tun. Zum Beispiel werden easy_installauch installierte Pakete darin abgelegt, mein sys.path sieht ungefähr so ​​aus:

['', '/usr/local/lib/python2.6/dist-packages/keyring-0.5.1-py2.6.egg', 
'/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk',  
'/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', 
'/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', 
'/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', 
'/usr/lib/pymodules/python2.6/gtk-2.0']

Daher ist der Pfad offensichtlich nicht der Standard, der in die Python-Binärdatei integriert ist.

Gibt es eine einzige Konfigurationsdatei, die die obigen Einträge enthält? Oder wie kann man es ändern?

Latanius
quelle

Antworten:

27

Die Site-Modul-Dokumentation und der Python-Suchpfad scheinen genau das zu sein, wonach Sie suchen.

Soweit ich weiß, werden diese Einträge ergänzt sys.pathdurch:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (Ändern Sie 2.6 auf Ihre Version von Python.)

Der einfachste Weg, dies zu ändern, ist das Hinzufügen einer Datei, /usr/local/lib/python2.6/dist-packages/site-packages.pthdie Folgendes enthält ../site-packages.

Alternativ können Sie vielleicht das Paket unterrichten, um zu verwenden site.getsitepackages()?

Mikel
quelle
1
Danke, funktioniert perfekt :) (Ich habe am Ende eine .pth-Datei zu /usr/local/python2.6/dist-packages hinzugefügt, die "../site-packages" enthält)
Latanius
1
Sie können auch ein Modul mit dem Namen erstellen, sitecustomize.pydas site.pyversucht, es zu importieren und zu ändern sys.path.
TestUser16418
5

Sie können eine neue Datei /etc/profile.d/local_python.shmit dem Inhalt erstellen

PYTHONPATH="/usr/local/lib/python2.6/site-packages/":"${PYTHONPATH}"
export PYTHONPATH

Damit wird die PYTHONPATHVariable für alle angemeldeten Benutzer auf Ihrem System festgelegt.

TestUser16418
quelle
7
Das ist wirklich nicht universell. Der Mechanismus /etc/profile.d funktioniert nur für Login-Shells für Benutzer mit Shells, die /etc/profile.d (bash / ksh / zsh) verwenden. Ich bin sicher, dass csh-Benutzer diese Änderung nicht sehen werden. Wird auch in Cron / At Jobs ignoriert.
Rich Homolka
2
Dies ist eine gute Möglichkeit, globale Umgebungsvariablen zu setzen (eine weitere Sache, die ich heute gelernt habe), aber wie ich im Beitrag erwähnt habe, habe ich nach einer pythonischeren Methode gesucht :)
Latanius
4

Ich möchte meine Ergebnisse zur Pfadänderung von Python zusammenfassen. Es gibt zwei Möglichkeiten, dies zu tun.

  • .pth Datei
  • PYTHONPATH

Jede .pth- Datei, die sich im Standardpfad befindet (siehe unten), wird mit ihrem Inhalt versehen sys.path. Das Format dieser .pth- Datei ist einfach: ein (Ordner-) Pfad pro Zeile. Überraschenderweise können die Pfade absolut oder relativ zur .pth- Datei sein.

Der Standardpfad ist der Ort, an dem sich der Interpreter befindet, und <some-prefix>/lib/python<version>/site-packagesin der <some-prefix>Regel der Ort /usr/.

PYTHONPATHist die Umgebungsvariable Ihres Betriebssystems. Auf Unix-Systemen listen Sie sie nach auf env. Die globale Änderung solcher Variablen erfolgt über .sh- Skripte im /etc/profile.d/Ordner, wie von @ TestUser16418 erwähnt.

katomaso
quelle
2
Es ist PYTHONPATH ohne "_"
heroxbd
1

Wenn Sie beispielsweise das sudsModul importieren möchten, das als .eggDatei verfügbar ist :

egg_path = '/home/shahid/suds_2.4.egg'

sys.path.append(egg_path)

import suds
# ... rest of code
Mohammad Shahid Siddiqui
quelle