Python ist wirklich bemüht, intelligent einzustellen sys.path
. Wie es eingestellt ist, kann sehr kompliziert werden . Die folgende Anleitung ist eine abgeschwächte, etwas-unvollständig, etwas-falsch, aber hoffentlich-nützliche Leitfaden für den Rang-und-Datei Python - Programmierer von dem, was passiert , wenn Python Zahlen heraus , was als verwenden Anfangswerte von sys.path
,
sys.executable
, sys.exec_prefix
und sys.prefix
bei einer normalen
Python-Installation.
Zunächst bemüht sich Python nach besten Kräften, den tatsächlichen physischen Speicherort im Dateisystem anhand der Angaben des Betriebssystems zu ermitteln. Wenn das Betriebssystem nur sagt, dass "Python" ausgeführt wird, befindet es sich in $ PATH. Es löst alle symbolischen Links auf. Sobald dies geschehen ist, wird der Pfad der gefundenen ausführbaren Datei als Wert für sys.executable
no ifs, ands oder buts verwendet.
Als nächstes werden die Anfangswerte für sys.exec_prefix
und bestimmt
sys.prefix
.
Wenn sich eine Datei pyvenv.cfg
im selben Verzeichnis wie
sys.executable
oder in einem Verzeichnis befindet, wird sie von Python angezeigt. Verschiedene Betriebssysteme machen mit dieser Datei verschiedene Dinge.
Einer der Werte in dieser Konfigurationsdatei, nach denen Python sucht, ist die Konfigurationsoption home = <DIRECTORY>
. Python verwendet dieses Verzeichnis anstelle des Verzeichnisses, sys.executable
in dem der Anfangswert von sys.prefix
später dynamisch festgelegt wird . Wenn die applocal = true
Einstellung in der pyvenv.cfg
Datei unter Windows angezeigt wird
, jedoch nicht die home = <DIRECTORY>
Einstellung, sys.prefix
wird sie auf das Verzeichnis festgelegt, das sie enthält sys.executable
.
Als nächstes wird die PYTHONHOME
Umgebungsvariable untersucht. Unter Linux und Mac
sys.prefix
und sys.exec_prefix
auf die PYTHONHOME
Umgebungsvariable gesetzt, falls vorhanden, ersetzt sie alle home = <DIRECTORY>
Einstellungen in pyvenv.cfg
. Unter Windows
sys.prefix
und sys.exec_prefix
wird auf die PYTHONHOME
Umgebungsvariable festgelegt, sofern vorhanden, es sei denn, in ist eine home = <DIRECTORY>
Einstellung vorhanden pyvenv.cfg
, die stattdessen verwendet wird.
Andernfalls werden diese sys.prefix
und sys.exec_prefix
gefunden, indem Sie vom Speicherort sys.executable
oder dem home
von pyvenv.cfg
gegebenenfalls angegebenen Verzeichnis rückwärts gehen .
Wenn sich die Datei lib/python<version>/dyn-load
in diesem Verzeichnis oder einem der übergeordneten Verzeichnisse befindet, ist dieses Verzeichnis
sys.exec_prefix
auf Linux oder Mac eingestellt. Wenn sich die Datei
lib/python<version>/os.py
im Verzeichnis oder in einem seiner Unterverzeichnisse befindet, wird dieses Verzeichnis sys.prefix
auf Linux, Mac und Windows festgelegt, wobei sys.exec_prefix
derselbe Wert wie
sys.prefix
unter Windows festgelegt wird. Dieser gesamte Schritt wird unter Windows übersprungen, wenn
applocal = true
festgelegt. Entweder wird das Verzeichnis von sys.executable
verwendet, oder, falls home
festgelegt pyvenv.cfg
, wird es stattdessen für den Anfangswert von verwendet sys.prefix
.
Wenn diese "Landmark" -Dateien sys.prefix
nicht gefunden werden können oder noch nicht gefunden wurden, setzt Python sys.prefix
auf einen "Fallback" -Wert. Linux und Mac verwenden beispielsweise vorkompilierte Standardeinstellungen als Werte für sys.prefix
und sys.exec_prefix
. Windows wartet, bis sys.path
es vollständig herausgefunden ist, um einen Fallback-Wert für festzulegen
sys.prefix
.
Dann bestimmt Python (worauf Sie alle gewartet haben) die Anfangswerte, in denen enthalten sein soll sys.path
.
- Das Verzeichnis des Skripts, das Python ausführt, wird hinzugefügt
sys.path
. Unter Windows ist dies immer die leere Zeichenfolge, die Python anweist, stattdessen den vollständigen Pfad zu verwenden, in dem sich das Skript befindet.
- Der Inhalt der Umgebungsvariablen PYTHONPATH wird, falls festgelegt, hinzugefügt
sys.path
, es sei denn, Sie arbeiten unter Windows und applocal
sind auf true in festgelegt pyvenv.cfg
.
- Der Zip-Dateipfad, der sich
<prefix>/lib/python35.zip
unter Linux / Mac und
os.path.join(os.dirname(sys.executable), "python.zip")
Windows befindet, wird hinzugefügt sys.path
.
- Wenn unter Windows und no
applocal = true
festgelegt wurde pyvenv.cfg
, wird der Inhalt der Unterschlüssel des Registrierungsschlüssels
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, falls vorhanden.
- Wenn unter Windows und no
applocal = true
festgelegt pyvenv.cfg
wurde und sys.prefix
nicht gefunden werden konnte, wird der Kerninhalt des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, sofern vorhanden.
- Wenn unter Windows und no
applocal = true
festgelegt wurde pyvenv.cfg
, wird der Inhalt der Unterschlüssel des Registrierungsschlüssels
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, falls vorhanden.
- Wenn unter Windows und no
applocal = true
festgelegt pyvenv.cfg
wurde und sys.prefix
nicht gefunden werden konnte, wird der Kerninhalt des Registrierungsschlüssels HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, sofern vorhanden.
- Wenn unter Windows und PYTHONPATH nicht festgelegt wurde, das Präfix nicht gefunden wurde und keine Registrierungsschlüssel vorhanden waren, wird der relative Wert für die Kompilierungszeit von PYTHONPATH hinzugefügt. Andernfalls wird dieser Schritt ignoriert.
- Pfade im Makro PYTHONPATH zur Kompilierungszeit werden relativ zu den dynamisch gefundenen hinzugefügt
sys.prefix
.
- Unter Mac und Linux wird der Wert von
sys.exec_prefix
hinzugefügt. Unter Windows wird das Verzeichnis sys.prefix
hinzugefügt , nach dem dynamisch gesucht wurde (oder verwendet wurde) .
Wenn zu diesem Zeitpunkt unter Windows kein Präfix gefunden wurde, versucht Python, es zu ermitteln, indem alle Verzeichnisse sys.path
nach den Orientierungspunktdateien durchsucht werden, wie dies beim sys.executable
vorherigen Verzeichnis der Fall war, bis etwas gefunden wird. Wenn dies nicht der Fall sys.prefix
ist, bleibt es leer.
Nach all dem lädt Python schließlich das site
Modul, das noch weitere Dinge hinzufügt sys.path
:
Zunächst werden bis zu vier Verzeichnisse aus einem Kopf- und einem Endteil erstellt. Für den Kopfteil verwendet es sys.prefix
und sys.exec_prefix
; leere Köpfe werden übersprungen. Für den Endteil wird die leere Zeichenfolge verwendet 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 wird geprüft, ob sie auf ein vorhandenes Verzeichnis verweist, und wenn ja, wird sie zu sys.path hinzugefügt und der neu hinzugefügte Pfad auf Konfigurationsdateien überprüft.