Frage Woher wird Pythons sys.path initialisiert?


Woher wird Pythons sys.path initialisiert?

UPD: Python fügt vor dem Verweis auf PYTHONPATH einige Pfade hinzu:

    >>> 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 PYTHONPATHs herkommen?


76
2018-05-22 13:19


Ursprung


Antworten:


"Initialisiert von der Umgebungsvariable PYTHONPATH plus einem installationsabhängigen Standard"

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


37
2018-05-22 13:21



Python versucht wirklich, intelligent zu setzen sys.path. Wie es ist Satz kann bekommen Ja wirklich  kompliziert. Der folgende Leitfaden ist ein verwässertes, etwas unvollständige, etwas falsche, aber hoffentlich nützliche Anleitung für den einfachen Python-Programmierer, was passiert, wenn Python findet heraus, was zu verwenden ist Anfangswerte von sys.path, sys.executable, sys.exec_prefix, und sys.prefix auf einen normal Python-Installation.

Erstens macht Python seine Ebene am besten, um seine tatsächliche physikalische herauszufinden Speicherort auf dem Dateisystem basierend auf dem, 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 es das getan hat, ist der Weg von Die ausführbare Datei wird als Wert für verwendet sys.executable, nein wenns, ands oder aber.

Als nächstes bestimmt es die Anfangswerte für sys.exec_prefix und   sys.prefix.

Wenn es eine Datei namens pyvenv.cfg im selben Verzeichnis wie sys.executable oder ein Verzeichnis hoch, Python schaut es an. Anders Betriebssysteme führen mit dieser Datei unterschiedliche Aktionen aus.

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

Als nächstes, die PYTHONHOME Umgebungsvariable wird untersucht. Unter Linux und Mac sys.prefix und sys.exec_prefix sind auf die eingestellt PYTHONHOME Umgebungsvariable, wenn Es existiert, ersetzend irgendein home = <DIRECTORY> Einstellung in pyvenv.cfg. Unter Windows sys.prefix und sys.exec_prefix ist auf die eingestellt PYTHONHOME Umgebungsvariable, wenn es existiert, es sei denn ein home = <DIRECTORY> Einstellung ist in vorhanden pyvenv.cfg, welches stattdessen verwendet wird.

Ansonsten diese sys.prefix und sys.exec_prefix werden gefunden, indem man rückwärts läuft von der Position von sys.executable, oder der home Verzeichnis von gegeben pyvenv.cfg wenn überhaupt.

Wenn die Datei lib/python<version>/dyn-load ist in diesem Verzeichnis gefunden oder eines seiner übergeordneten Verzeichnisse, auf die dieses Verzeichnis festgelegt werden soll sys.exec_prefix auf Linux oder Mac. Wenn die Datei lib/python<version>/os.py ist in dem Verzeichnis oder einem seiner gefunden Unterverzeichnisse, das Verzeichnis wird festgelegt sys.prefix unter Linux, Mac und Windows mit sys.exec_prefix auf den gleichen Wert wie eingestellt sys.prefix unter Windows. Dieser gesamte Schritt wird unter Windows übersprungen applocal = true ist eingestellt. Entweder das Verzeichnis von sys.executable ist verwendet oder, wenn home ist eingestellt pyvenv.cfg, das wird stattdessen für verwendet der Anfangswert von sys.prefix.

Wenn es diese "Landmark" -Dateien nicht finden kann oder sys.prefix war es nicht noch gefunden, dann python setzt sys.prefix zu einem "Fallback" Wert. Linux und Mac zum Beispiel verwenden vorkompilierte Standardeinstellungen als Werte von sys.prefix und sys.exec_prefix. Windows wartet bis sys.path ist vollständig festgelegt, um einen Fallback-Wert für festzulegen sys.prefix.

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

  1. Das Verzeichnis des Skripts, in dem Python ausgeführt wird, wird hinzugefügt sys.path. Unter Windows ist dies immer die leere Zeichenfolge, die python angibt Verwenden Sie stattdessen das aktuelle Arbeitsverzeichnis.
  2. Der Inhalt der PYTHONPATH-Umgebungsvariablen, falls gesetzt, wird hinzugefügt sys.path, es sei denn du bist unter Windows und applocal ist auf wahr gesetzt pyvenv.cfg.
  3. Der ZIP-Dateipfad, der <prefix>/lib/python35.zip auf Linux / Mac und os.path.join(os.dirname(sys.executable), "python.zip") unter Windows wird hinzugefügt sys.path.
  4. Wenn unter Windows und nicht applocal = true wurde eingestellt pyvenv.cfg, dann den Inhalt der Unterschlüssel des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ werden hinzugefügt, falls vorhanden.
  5. Wenn unter Windows und nicht applocal = true wurde eingestellt pyvenv.cfg, und sys.prefix konnte nicht gefunden werden, dann ist die Kerninhalte des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ wird hinzugefügt, wenn es existiert;
  6. Wenn unter Windows und nicht applocal = true wurde eingestellt pyvenv.cfg, dann den Inhalt der Unterschlüssel des Registrierungsschlüssels HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ werden hinzugefügt, falls vorhanden.
  7. Wenn unter Windows und nicht applocal = true wurde eingestellt pyvenv.cfg, und sys.prefix konnte nicht gefunden werden, dann ist die Kerninhalte des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ wird hinzugefügt, wenn es existiert;
  8. Wenn unter Windows und PYTHONPATH nicht festgelegt wurde, das Präfix nicht gefunden wurde und keine Registrierungsschlüssel vorhanden waren, dann die der relative Kompilierzeitwert von PYTHONPATH wird hinzugefügt; Andernfalls wird dieser Schritt ignoriert.
  9. Pfade im Kompilierzeit-Makro PYTHONPATH werden relativ zum dynamisch gefundenen hinzugefügt sys.prefix.
  10. Auf Mac und Linux ist der Wert von sys.exec_prefix hinzugefügt. Unter Windows das Verzeichnis welches für die dynamische Suche verwendet wurde (oder verwendet worden wäre) sys.prefix ist hinzugefügt.

Wenn zu diesem Zeitpunkt unter Windows kein Präfix gefunden wurde, versucht Python dies zu tun Bestimmen Sie es durch Suchen alle die Verzeichnisse in sys.path für die Landmark-Dateien, wie es mit dem Verzeichnis von sys.executable vorher, bis es etwas findet. Wenn nicht, sys.prefix ist leer gelassen.

Nach all dem lädt Python schließlich die site Modul, das noch etwas hinzufügt sys.path:

Es beginnt mit dem Erstellen von bis zu vier Verzeichnissen aus einem Kopf und einem   Schwanz Teil. Für den Kopfteil verwendet es sys.prefix und sys.exec_prefix;   leere Köpfe werden übersprungen. Für den Endteil verwendet er die leere Zeichenkette   und dann lib/site-packages (unter Windows) oder lib/pythonX.Y/site-packages   und dann lib/site-python (auf Unix und Macintosh). Für jeden der   verschiedene Kopf-Schwanz-Kombinationen, sieht es, wenn es sich auf ein existierendes bezieht   Verzeichnis, und wenn ja, fügt es zu sys.path hinzu und inspiziert auch das neu   Pfad für Konfigurationsdateien hinzugefügt.


35
2017-07-15 19:19