2009-05-22 13 views
68

Woher wird Pythons sys.path initialisiert?Woher wird Pythons sys.path initialisiert?

UPD: Python ist das Hinzufügen einige Wege vor beziehe zu PYTHONPATH:

>>> import sys 
    >>> from pprint import pprint as p 
    >>> p(sys.path) 
    ['', 
    'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg', 
    'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg', 
    'c:\\testdir', 
    'C:\\Windows\\system32\\python25.zip', 
    'C:\\Python25\\DLLs', 
    'C:\\Python25\\lib', 
    'C:\\Python25\\lib\\plat-win', 
    'C:\\Python25\\lib\\lib-tk', 
    'C:\\Python25', 
    'C:\\Python25\\lib\\site-packages', 
    'C:\\Python25\\lib\\site-packages\\PIL', 
    'C:\\Python25\\lib\\site-packages\\win32', 
    'C:\\Python25\\lib\\site-packages\\win32\\lib', 
    'C:\\Python25\\lib\\site-packages\\Pythonwin'] 

Mein PYTHONPATH ist:

PYTHONPATH=c:\testdir 

Ich frage mich, wo diese Wege vor PYTHONPATH die diejenigen kommen?

Antwort

36

"aus der Umgebungsvariablen PYTHONPATH Initialized sowie eine Installation abhängige default"

-http://docs.python.org/library/sys.html#sys.path

+5

Ich denke, sie von der Website-Modul kommen: http://docs.python.org/library/site.html – ashcatch

+12

Die Website Modul lädt und analysiert die Inhalte der .pth Dateien in Ihrer Website-Pakete Verzeichnis. Diese .pth Dateien enthalten Ergänzungen zu Ihrem PYTHONPATH – ASk

29

Python versucht, wirklich intelligent sys.path gesetzt schwer. Wie es ist Set kann reallycomplicated bekommen. Der folgende Leitfaden ist ein verwässertes, etwas unvollständiges, etwas falsches, aber hoffentlich nützliches Handbuch für den einfachen Python-Programmierer von dem, was passiert, wenn Python herausfindet, was man als Anfangswerte verwenden soll von sys.path, sys.executable, sys.exec_prefix und sys.prefix auf einem normalen Python-Installation.

Zuerst macht Python seine Ebene am besten, um herauszufinden, seine tatsächliche physische Speicherort auf dem Dateisystem basierend auf was das Betriebssystem sagt es. Wenn das Betriebssystem nur sagt "Python" läuft, findet es sich in $ PATH. Es löst alle symbolischen Links auf. Sobald dies geschehen ist, wird der Pfad der ausführbare Datei, die er findet, als Wert für sys.executable, no ifs, ands oder buts verwendet. Als nächstes werden die Anfangswerte für sys.exec_prefix und sys.prefix bestimmt.

Wenn es eine Datei namens pyvenv.cfg im selben Verzeichnis wie sys.executable oder ein Verzeichnis nach oben gibt, schaut Python darauf. Verschiedene Betriebssysteme machen verschiedene Dinge mit dieser Datei.

Einer der Werte in dieser Konfigurationsdatei, nach der Python sucht, ist die Konfigurationsoption home = <DIRECTORY>. Python verwendet dieses Verzeichnis anstelle des Verzeichnisses, das sys.executable enthält, wenn es den Anfangswert von sys.prefix später dynamisch festlegt. Wenn die applocal = true Einstellung in der pyvenv.cfg Datei unter Windows angezeigt wird, aber nicht die home = <DIRECTORY> Einstellung, , dann wird sys.prefix auf das Verzeichnis festgelegt, das sys.executable enthält.

Als nächstes wird die Umgebungsvariable PYTHONHOME untersucht. Unter Linux und Mac, sys.prefix und sys.exec_prefix werden das PYTHONHOME Umgebungsvariable gesetzt, wenn es existiert, jede home = <DIRECTORY> Einstellung in pyvenv.cfg ablöst.Unter Windows sys.prefix und sys.exec_prefix zum PYTHONHOME Umgebungsvariable gesetzt ist, wenn es vorhanden ist, ist es sei denn, eine home = <DIRECTORY> Einstellung in pyvenv.cfg, die stattdessen verwendet wird.

Ansonsten diese sys.prefix und sys.exec_prefix werden durch Rückwärtsgehen vom Ort des sys.executable oder das home Verzeichnis gegeben durch pyvenv.cfg wenn überhaupt vorhanden.

Wenn die Datei lib/python<version>/dyn-load in diesem Verzeichnis oder eines seiner übergeordneten Verzeichnissen gefunden wird, wird das Verzeichnis sein sys.exec_prefix unter Linux oder Mac zu setzen. Wenn die Datei lib/python<version>/os.py im Verzeichnis oder einen seiner Verzeichnisse gefunden wird, wird das Verzeichnis festgelegt sys.prefix auf Linux sein, Mac und Windows, mit sys.exec_prefix auf den gleichen Wert wie sys.prefix unter Windows. Dieser gesamte Schritt wird unter Windows übersprungen, wenn applocal = true eingestellt ist. Entweder das Verzeichnis sys.executable wird verwendet oder, wenn home in pyvenv.cfg eingestellt ist, wird anstelle von der Anfangswert sys.prefix verwendet.

Wenn es nicht diese „Wahrzeichen“ Dateien finden oder sys.prefix nicht noch nicht gefunden, dann Python-Sets sys.prefix auf einen „Rückfall“ Wert. Linux und Mac zum Beispiel verwenden vorkompilierte Standardwerte wie die Werte von sys.prefix und sys.exec_prefix. Windows wartet , bis sys.path vollständig berechnet ist, um einen Fallback-Wert für sys.prefix festzulegen.

Dann, (worauf Sie alle gewartet haben), bestimmt Python die Anfangswerte , die in sys.path enthalten sein sollen.

  1. Das Verzeichnis des Skripts, das Python ausführt, wird sys.path hinzugefügt. Unter Windows ist dies immer die leere Zeichenfolge, die python an anweist, stattdessen das aktuelle Arbeitsverzeichnis zu verwenden.
  2. Der Inhalt der Umgebungsvariablen PYTHONPATH, wenn gesetzt, wird sys.path hinzugefügt, es sei denn, Sie auf Windows sind und applocal in pyvenv.cfg auf true gesetzt.
  3. Der ZIP-Dateipfad, der <prefix>/lib/python35.zip unter Linux/Mac und os.path.join(os.dirname(sys.executable), "python.zip") unter Windows ist, wird zu sys.path hinzugefügt.
  4. Wenn unter Windows applocal = true in pyvenv.cfg festgelegt wurde, werden die Inhalte der Unterschlüssel des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ hinzugefügt, sofern vorhanden.
  5. Wenn auf Windows und kein applocal = true wurde in pyvenv.cfg, Satz und sys.prefix nicht gefunden werden konnte, dann die Kerninhalte der des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ hinzugefügt wird, wenn es vorhanden ist;
  6. Wenn auf Windows und keine applocal = true wurden in pyvenv.cfg, dann wird der Inhalt des Unterschlüssels des Registrierungsschlüssels HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ hinzugefügt werden, wenn ich keine weiterführende Haftung.
  7. Wenn auf Windows und kein applocal = true wurde in pyvenv.cfg, Satz und sys.prefix nicht gefunden werden konnte, dann die Kerninhalte der des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ hinzugefügt wird, wenn es vorhanden ist;
  8. Wenn unter Windows und PYTHONPATH nicht festgelegt wurde, das Präfix nicht gefunden wurde und keine Registrierungsschlüssel vorhanden waren, wird der relative Kompilierzeitwert von PYTHONPATH hinzugefügt; Andernfalls wird dieser Schritt ignoriert.
  9. Pfade im Kompilierzeitmakro PYTHONPATH werden relativ zum dynamisch gefundenen sys.prefix hinzugefügt. Auf Mac und Linux wird der Wert sys.exec_prefix hinzugefügt. Unter Windows wurde das Verzeichnis , das für die dynamische Suche nach sys.prefix verwendet wurde (oder verwendet wurde), hinzugefügt.

unter Windows In diesem Stadium, wenn kein Präfix gefunden wurde, dann wird Python bestimmen sie versuchen, durch alle die Verzeichnisse in sys.path für die Grenzstein-Dateien suchen, , wie es mit dem Verzeichnis zu tun versuchte, sys.executable vorher, bis es etwas findet. Wenn nicht, wird sys.prefix leer gelassen.

Endlich, nach all dem, lädt Python das site-Modul, das Material noch weiter zu sys.path ergänzt:

Es beginnt mit vier Verzeichnisse aus einem Kopf und einem Schwanz Teil der Konstruktion auf. Für den Kopfteil verwendet es sys.prefix und sys.exec_prefix; leere Köpfe werden übersprungen. Für den Endteil verwendet es die leere Zeichenkette und dann lib/site-packages (unter Windows) oder lib/pythonX.Y/site-packages und dann lib/site-python (unter Unix und Macintosh). Für jede der verschiedenen Head-Tail-Kombinationen sieht es, ob es sich auf ein existierendes -Verzeichnis bezieht, und falls dies der Fall ist, fügt es sys.path hinzu und inspiziert auch den neuen hinzugefügten Pfad für Konfigurationsdateien.

+1

Trotz, was seine Dokumente sagen, 'sys.executable' kann ein symbolischer Link sein oder tatsächlich kann es alles sein, wenn' argv [0] 'Schrägstriche enthält. Der eigentliche * Pfad * zur ausführbaren Datei (von 'execv (Pfad, argv)' Aufruf) wird nicht verwendet. – jfs