Woher wird Pythons sys.path initialisiert?
UPD : Python fügt einige Pfade hinzu, bevor auf PYTHONPATH verwiesen wird:
>>> 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, woher diese Wege vor PYTHONPATHs kommen.
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 vonsys.path
,sys.executable
,sys.exec_prefix
undsys.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 bestimmtsys.prefix
.Wenn sich eine Datei
pyvenv.cfg
im selben Verzeichnis wiesys.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 vonsys.prefix
später dynamisch festgelegt wird . Wenn dieapplocal = true
Einstellung in derpyvenv.cfg
Datei unter Windows angezeigt wird , jedoch nicht diehome = <DIRECTORY>
Einstellung,sys.prefix
wird sie auf das Verzeichnis festgelegt, das sie enthältsys.executable
.Als nächstes wird die
PYTHONHOME
Umgebungsvariable untersucht. Unter Linux und Macsys.prefix
undsys.exec_prefix
auf diePYTHONHOME
Umgebungsvariable gesetzt, falls vorhanden, ersetzt sie allehome = <DIRECTORY>
Einstellungen inpyvenv.cfg
. Unter Windowssys.prefix
undsys.exec_prefix
wird auf diePYTHONHOME
Umgebungsvariable festgelegt, sofern vorhanden, es sei denn, in ist einehome = <DIRECTORY>
Einstellung vorhandenpyvenv.cfg
, die stattdessen verwendet wird.Andernfalls werden diese
sys.prefix
undsys.exec_prefix
gefunden, indem Sie vom Speicherortsys.executable
oder demhome
vonpyvenv.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 Verzeichnissys.exec_prefix
auf Linux oder Mac eingestellt. Wenn sich die Dateilib/python<version>/os.py
im Verzeichnis oder in einem seiner Unterverzeichnisse befindet, wird dieses Verzeichnissys.prefix
auf Linux, Mac und Windows festgelegt, wobeisys.exec_prefix
derselbe Wert wiesys.prefix
unter Windows festgelegt wird. Dieser gesamte Schritt wird unter Windows übersprungen, wennapplocal = true
festgelegt. Entweder wird das Verzeichnis vonsys.executable
verwendet, oder, fallshome
festgelegtpyvenv.cfg
, wird es stattdessen für den Anfangswert von verwendetsys.prefix
.Wenn diese "Landmark" -Dateien
sys.prefix
nicht gefunden werden können oder noch nicht gefunden wurden, setzt Pythonsys.prefix
auf einen "Fallback" -Wert. Linux und Mac verwenden beispielsweise vorkompilierte Standardeinstellungen als Werte fürsys.prefix
undsys.exec_prefix
. Windows wartet, bissys.path
es vollständig herausgefunden ist, um einen Fallback-Wert für festzulegensys.prefix
.Dann bestimmt Python (worauf Sie alle gewartet haben) die Anfangswerte, in denen enthalten sein soll
sys.path
.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.sys.path
, es sei denn, Sie arbeiten unter Windows undapplocal
sind auf true in festgelegtpyvenv.cfg
.<prefix>/lib/python35.zip
unter Linux / Mac undos.path.join(os.dirname(sys.executable), "python.zip")
Windows befindet, wird hinzugefügtsys.path
.applocal = true
festgelegt wurdepyvenv.cfg
, wird der Inhalt der Unterschlüssel des RegistrierungsschlüsselsHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, falls vorhanden.applocal = true
festgelegtpyvenv.cfg
wurde undsys.prefix
nicht gefunden werden konnte, wird der Kerninhalt des RegistrierungsschlüsselsHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, sofern vorhanden.applocal = true
festgelegt wurdepyvenv.cfg
, wird der Inhalt der Unterschlüssel des RegistrierungsschlüsselsHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, falls vorhanden.applocal = true
festgelegtpyvenv.cfg
wurde undsys.prefix
nicht gefunden werden konnte, wird der Kerninhalt des RegistrierungsschlüsselsHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
hinzugefügt, sofern vorhanden.sys.prefix
.sys.exec_prefix
hinzugefügt. Unter Windows wird das Verzeichnissys.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 beimsys.executable
vorherigen Verzeichnis der Fall war, bis etwas gefunden wird. Wenn dies nicht der Fallsys.prefix
ist, bleibt es leer.Nach all dem lädt Python schließlich das
site
Modul, das noch weitere Dinge hinzufügtsys.path
:quelle
sys.executable
kann es sich um einen Symlink handeln, oder es kann sich um etwas handeln,argv[0]
das Schrägstriche enthält. Der tatsächliche Pfad zur ausführbaren Datei (vomexecv(path, argv)
Aufruf) wird nicht verwendet.sys.path
Windows 10: Ich erhalte immer den vollständigen Pfad meines Skriptverzeichnisses als sys.path [0] (nicht cwd ''). Sie sollten in der Lage sein, etwas wiepython some\other\path\than\cwd\main.py
site-packages
haben.pth
und.egg-link
Suffixe.