Python si sforza davvero di impostare in modo intelligente sys.path. Il modo in cui è impostato può diventare davvero complicato . La seguente guida è un po 'incompleto, guida annacquata, in qualche modo, sbagliato, ma si spera-utili per il rango e file python programmatore di ciò che accade quando le figure di pitone che cosa da usare come i valori iniziali di sys.path,
sys.executable, sys.exec_prefix, e sys.prefixsu una normale
installazione di Python.
Innanzitutto, python fa del suo meglio per capire la sua effettiva posizione fisica nel filesystem in base a ciò che gli dice il sistema operativo. Se il sistema operativo dice che "python" è in esecuzione, si trova in $ PATH. Risolve tutti i collegamenti simbolici. Una volta eseguita questa operazione, il percorso dell'eseguibile che trova viene utilizzato come valore per sys.executable, senza se e senza ma.
Successivamente, determina i valori iniziali per sys.exec_prefixe
sys.prefix.
Se c'è un file chiamato pyvenv.cfgnella stessa directory
sys.executableo una directory in alto, Python lo guarda. Sistemi operativi diversi fanno cose diverse con questo file.
Uno dei valori in questo file di configurazione che Python cerca è l'opzione di configurazione home = <DIRECTORY>. Python userà questa directory invece della directory che la contiene sys.executable
quando imposta dinamicamente il valore iniziale di sys.prefixlater. Se l' applocal = trueimpostazione appare nel
pyvenv.cfgfile su Windows, ma non l' home = <DIRECTORY>impostazione, sys.prefixverrà impostata sulla directory contenente sys.executable.
Successivamente, PYTHONHOMEviene esaminata la variabile di ambiente. Su Linux e Mac
sys.prefixe sys.exec_prefixsono impostati sulla PYTHONHOMEvariabile di ambiente, se esistente, sostituendo qualsiasi home = <DIRECTORY>impostazione in pyvenv.cfg. In Windows,
sys.prefixed sys.exec_prefixè impostato al PYTHONHOMEvariabile d'ambiente, se esiste, a meno che un home = <DIRECTORY>ambiente è presente in pyvenv.cfg, che viene utilizzato invece.
Altrimenti, questi sys.prefixe sys.exec_prefixsi trovano camminando all'indietro dalla posizione di sys.executable, o dalla homedirectory fornita da pyvenv.cfgse esiste.
Se il file lib/python<version>/dyn-loadsi trova in quella directory o in una delle sue directory padre, quella directory è impostata per essere
sys.exec_prefixsu Linux o Mac. Se il file
lib/python<version>/os.pysi trova nella directory o in una delle sue sottodirectory, tale directory è impostata sys.prefixsu Linux, Mac e Windows, con sys.exec_prefixlo stesso valore di
sys.prefixWindows. L'intero passaggio viene saltato su Windows se
applocal = trueè impostato. sys.executableViene utilizzata la directory di oppure, se homeimpostata in pyvenv.cfg, viene utilizzata al posto del valore iniziale di sys.prefix.
Se non riesce a trovare questi file "punto di riferimento" o sys.prefixnon è stato ancora trovato, python si imposta sys.prefixsu un valore di "riserva". Linux e Mac, ad esempio, utilizzano valori predefiniti precompilati come valori di sys.prefixe sys.exec_prefix. Windows attende fino a quando non sys.pathviene completamente individuato per impostare un valore di fallback per
sys.prefix.
Quindi, (quello che stavate tutti aspettando), python determina i valori iniziali in cui devono essere contenuti sys.path.
- La directory dello script in cui è in esecuzione python viene aggiunta
sys.path. Su Windows, questa è sempre la stringa vuota, che dice a Python di utilizzare invece il percorso completo in cui si trova lo script.
- Il contenuto della variabile d'ambiente PYTHONPATH, se impostata, viene aggiunto a
sys.path, a meno che tu non sia su Windows e applocalsia impostato su true in pyvenv.cfg.
- Il percorso del file zip, che si trova
<prefix>/lib/python35.zipsu Linux / Mac e
os.path.join(os.dirname(sys.executable), "python.zip")su Windows, viene aggiunto a sys.path.
- Se su Windows e non è
applocal = truestato impostato alcun pyvenv.cfg, HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\viene aggiunto il contenuto delle sottochiavi della chiave di registro
, se presente.
- Se su Windows e no è
applocal = truestato impostato pyvenv.cfge sys.prefixnon è stato possibile trovarlo, viene aggiunto il contenuto principale della chiave di registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\, se esiste;
- Se su Windows e non è
applocal = truestato impostato alcun pyvenv.cfg, HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\viene aggiunto il contenuto delle sottochiavi della chiave di registro
, se presente.
- Se su Windows e no è
applocal = truestato impostato pyvenv.cfge sys.prefixnon è stato possibile trovarlo, viene aggiunto il contenuto principale della chiave di registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\, se esiste;
- Se su Windows e PYTHONPATH non è stato impostato, il prefisso non è stato trovato e non erano presenti chiavi di registro, viene aggiunto il valore relativo in fase di compilazione di PYTHONPATH; in caso contrario, questo passaggio viene ignorato.
- I percorsi nella macro in fase di compilazione PYTHONPATH vengono aggiunti rispetto a quelli trovati dinamicamente
sys.prefix.
- Su Mac e Linux,
sys.exec_prefixviene aggiunto il valore di . Su Windows, sys.prefixviene aggiunta la directory che è stata utilizzata (o sarebbe stata utilizzata) per la ricerca dinamica .
In questa fase su Windows, se non è stato trovato alcun prefisso, allora python proverà a determinarlo cercando in tutte le directory sys.pathi file di riferimento, come ha cercato di fare con la directory di in sys.executableprecedenza, finché non trova qualcosa. In caso contrario, sys.prefixviene lasciato vuoto.
Alla fine, dopo tutto questo, Python carica il sitemodulo, che aggiunge altre cose a sys.path:
Inizia costruendo fino a quattro directory da una parte di testa e una di coda. Per la parte di testa utilizza sys.prefixe sys.exec_prefix; le teste vuote vengono saltate. Per la parte di coda, utilizza la stringa vuota e quindi lib/site-packages(su Windows) o lib/pythonX.Y/site-packages
e quindi lib/site-python(su Unix e Macintosh). Per ciascuna delle distinte combinazioni testa-coda, vede se si riferisce a una directory esistente e, in tal caso, la aggiunge a sys.path e controlla anche il percorso appena aggiunto per i file di configurazione.