Was richtet sys.path mit Python ein und wann?

74

Wenn ich renne

import sys 
print sys.path

Auf meinem Mac (Mac OS X 10.6.5, Python 2.6.1) erhalte ich die folgenden Ergebnisse.

/Library/Python/2.6/site-packages/ply-3.3-py2.6.egg
...
/Library/Python/2.6/site-packages/ipython-0.10.1-py2.6.egg
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages

/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Python/2.6/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode

Sie sind in 5 Kategorien eingeteilt.

  • /Library/Python/2.6/site-packages/*.egg
  • /Library/Python/2.6/site-packages
  • Frameworks / Python.framework / Versions / 2.6 / lib / python2.6
  • Frameworks / Python.framework / Versions / 2.6 / Extras / lib / python
  • PATH von der Umgebungsvariablen PYTHONPATH.

Und ich kann mit dem Code weitere Pfade hinzufügen

sys.path.insert(0, MORE_PATH)
  • Welche Routinen richten diese Pfade ein und wann?
  • Sind einige der Pfade im Python-Quellcode erstellt?
  • Ist es möglich, dass die mit 'sys.path.insert' eingefügten Pfade ignoriert werden? Ich bin neugierig, da ich bei mod_wsgi festgestellt habe, dass die Pfade bei 'sys.path.insert' nicht gefunden werden. Ich habe einen anderen Beitrag für diese Frage gestellt.

HINZUGEFÜGT

Basierend auf Michaels Antwort habe ich in site.py nachgesehen und den folgenden Code erhalten.

def addsitepackages(known_paths):
    """Add site-packages (and possibly site-python) to sys.path"""
    sitedirs = []
    seen = []

    for prefix in PREFIXES:
        if not prefix or prefix in seen:
            continue
        seen.append(prefix)

        if sys.platform in ('os2emx', 'riscos'):
            sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
        elif sys.platform == 'darwin' and prefix == sys.prefix:
            sitedirs.append(os.path.join("/Library/Python", sys.version[:3], "site-packages"))

Ich denke auch, dass der Verzeichnisname mit site.py (/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6 für meinen Mac) in Python-Quellcode integriert sein sollte.

prosseek
quelle
2
Ein Teil davon kann mit Pythons sys.path-Wert beantwortet werden ?
wkl
Wenn Sie immer noch versuchen, Ihre vorherige Frage herauszufinden - Es ist weitaus wahrscheinlicher, dass Ihr Problem in der Startdatei liegt, als etwas, das mit Site-Importen zu tun hat. Es wäre eine äußerst schlechte Praxis für ein Paket, Pfade zu entfernen, über die sie nichts Neues wissen.
nate c
Warum seenist kein Set? : P
Mr_and_Mrs_D
Die beste Antwort, die ich auf dieselbe Frage gefunden habe , finden Sie hier . Dies ist ein Link zu einer Antwort auf eine andere SO-Frage.
Mike Williamson

Antworten:

30

Das meiste wird in Pythons eingerichtet, site.pydas beim Starten des Interpreters automatisch importiert wird (es sei denn, Sie starten es mit der -SOption). Während der Initialisierung werden im Interpreter selbst nur wenige Pfade eingerichtet (Sie können dies herausfinden, indem Sie Python mit starten -S).

Darüber hinaus werden einige Frameworks (wie Django, glaube ich) sys.pathbeim Start geändert, um ihren Anforderungen zu entsprechen.

Das siteModul hat eine ziemlich gute Dokumentation , einen kommentierten Quellcode und druckt einige Informationen aus, wenn Sie es über ausführen python -m site.

Michael
quelle
Anscheinend werden in Debian und Derivaten Verzeichnisse in /usr/local/lib/python<version>/dist-packagesund /usr/{lib,share}/python<version>/dist-packagesautomatisch zum Pfad hinzugefügt (gemäß /usr/lib/python2.7/site.pyUbuntu 14.04).
z0r
15

Vom Lernen von Python :

sys.path ist der Modul-Suchpfad. Python konfiguriert es beim Programmstart und führt automatisch das Ausgangsverzeichnis der Datei der obersten Ebene (oder eine leere Zeichenfolge zur Bezeichnung des aktuellen Arbeitsverzeichnisses), alle PYTHONPATH-Verzeichnisse, den Inhalt aller von Ihnen erstellten .pth- Dateipfade und das zusammen Standardbibliotheksverzeichnisse. Das Ergebnis ist eine Liste von Verzeichnisnamenzeichenfolgen, die Python bei jedem Import einer neuen Datei durchsucht.

Andrew Clark
quelle
6

site.py ist in der Tat die Antwort. Ich wollte alle Abhängigkeiten von dem alten Python entfernen, der standardmäßig auf meinem Mac installiert ist. Dies funktioniert ziemlich gut, da 'site.py' jedes Mal aufgerufen wird, wenn der Python-Interpreter gestartet wird.

Für Mac habe ich die folgende Zeile am Ende von main () in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/site.py manuell hinzugefügt:

    sys.path =  filter (lambda a: not a.startswith('/System'), sys.path)
damirv
quelle
Bitte denken Sie daran, dass site.pydies durch die Verwendung der Befehlszeilenoption -Sbeim Ausführen von Python verhindert werden kann. Aus Dokumenten - Deaktivieren Sie den Import des Moduls siteund die damit verbundenen ortsabhängigen Manipulationen sys.path.
Piotr Dobrogost
4

Pfad hat diese Teile:

  • Betriebssystempfade mit Ihren Systembibliotheken
  • Das aktuelle Verzeichnis Python startete von
  • Umgebungsvariable $PYTHONPATH
  • Sie können zur Laufzeit Pfade hinzufügen.

Pfade werden nicht ignoriert. Sie werden jedoch möglicherweise nicht gefunden, und dies führt nicht zu einem Fehler. sys.path sollte nur ebenfalls hinzugefügt und nicht abgezogen werden. Django würde keine Pfade entfernen.

nate c
quelle
1

Hinzufügen zur akzeptierten Antwort und Adressieren der Kommentare, die besagen, dass ein Modul keine Einträge entfernen sollte aus sys.path:

Dies trifft im Großen und Ganzen zu, aber es gibt Umstände, unter denen Sie Änderungen vornehmen möchten, sys.pathindem Sie Einträge entfernen. Zum Beispiel - und das ist Mac-spezifisch; * nix / Windows-Folgerungen können vorhanden sein. Wenn Sie eine benutzerdefinierte Folgerung Python.frameworkfür die Aufnahme in Ihr eigenes Projekt erstellen, möchten Sie möglicherweise die Standardeinträge ignorieren, die sys.pathauf das System verweisen Python.framework.

Sie haben mehrere Möglichkeiten:

  1. Hacken Sie die site.py, wie @damirv angibt, oder

  2. Fügen Sie sitecustomizedem benutzerdefinierten Framework Ihr eigenes Modul (oder Paket) hinzu, das das gleiche Endergebnis erzielt. Wie in den site.pyKommentaren angegeben (jedenfalls für 2.7.6):

    Nach diesen Pfadmanipulationen wird versucht, ein Modul mit dem Namen sitecustomize zu importieren, das beliebige zusätzliche standortspezifische Anpassungen vornehmen kann. Wenn dieser Import mit einer ImportError-Ausnahme fehlschlägt, wird er unbemerkt ignoriert.

Robin Macharg
quelle
1

Beachten Sie auch: Wenn die PYTHONHOMEUmgebung env var festgelegt ist, werden Standardbibliotheken aus diesem Pfad anstelle der Standardbibliotheken geladen, wie dokumentiert .

Dies ist keine direkte Antwort auf die Frage, sondern etwas, das ich gerade entdeckt habe und das dazu führte, dass die falschen Standardbibliotheken geladen wurden, und meine Suche führte mich hierher.

Gilly
quelle
PYTHONHOME gilt im Fall von mod_wsgi nicht wirklich, da Apache nicht über die Benutzerumgebung gestartet wird und der Root-Benutzer, der wie über Skripte von Systemeinheiten gestartet wird, es nicht festgelegt hätte.
Graham Dumpleton
1
@GrahamDumpleton Vielleicht, aber der Titel der Frage wird wahrscheinlich andere in allgemeineren Fällen hierher führen. Ich hoffe nur, dass diese Informationen jemandem helfen können.
Gilly
1

Sie verwenden Systempython /usr/bin/python.

sys.path wird beim Start von Python aus Systemdateien festgelegt.

Berühren Sie diese Dateien nicht, insbesondere site.py, da dies das System stören kann.

Sie können jedoch sys.path in Python ändern, insbesondere beim Start:

in ~ / .bashrc oder ~ / .zshrc:

export PYTHONSTARTUP=~/.pythonrc

in ~ / .pythonrc:

Schreiben Sie Ihre Änderungen in sys.path.

Diese Änderungen sind nur für Sie in interaktiven Shells.

Installieren Sie zum Hacken mit geringem Risiko für das System Ihre eigene und neuere Python-Version.

Pierre ALBARÈDE
quelle
Wie können Sie feststellen, dass Sie das System Python / usr / bin / python verwenden?
Acton