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.prefix
su 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_prefix
e
sys.prefix
.
Se c'è un file chiamato pyvenv.cfg
nella stessa directory
sys.executable
o 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.prefix
later. Se l' applocal = true
impostazione appare nel
pyvenv.cfg
file su Windows, ma non l' home = <DIRECTORY>
impostazione, sys.prefix
verrà impostata sulla directory contenente sys.executable
.
Successivamente, PYTHONHOME
viene esaminata la variabile di ambiente. Su Linux e Mac
sys.prefix
e sys.exec_prefix
sono impostati sulla PYTHONHOME
variabile di ambiente, se esistente, sostituendo qualsiasi home = <DIRECTORY>
impostazione in pyvenv.cfg
. In Windows,
sys.prefix
ed sys.exec_prefix
è impostato al PYTHONHOME
variabile d'ambiente, se esiste, a meno che un home = <DIRECTORY>
ambiente è presente in pyvenv.cfg
, che viene utilizzato invece.
Altrimenti, questi sys.prefix
e sys.exec_prefix
si trovano camminando all'indietro dalla posizione di sys.executable
, o dalla home
directory fornita da pyvenv.cfg
se esiste.
Se il file lib/python<version>/dyn-load
si trova in quella directory o in una delle sue directory padre, quella directory è impostata per essere
sys.exec_prefix
su Linux o Mac. Se il file
lib/python<version>/os.py
si trova nella directory o in una delle sue sottodirectory, tale directory è impostata sys.prefix
su Linux, Mac e Windows, con sys.exec_prefix
lo stesso valore di
sys.prefix
Windows. L'intero passaggio viene saltato su Windows se
applocal = true
è impostato. sys.executable
Viene utilizzata la directory di oppure, se home
impostata 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.prefix
non è stato ancora trovato, python si imposta sys.prefix
su un valore di "riserva". Linux e Mac, ad esempio, utilizzano valori predefiniti precompilati come valori di sys.prefix
e sys.exec_prefix
. Windows attende fino a quando non sys.path
viene 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 applocal
sia impostato su true in pyvenv.cfg
.
- Il percorso del file zip, che si trova
<prefix>/lib/python35.zip
su 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 = true
stato 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 = true
stato impostato pyvenv.cfg
e sys.prefix
non è 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 = true
stato 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 = true
stato impostato pyvenv.cfg
e sys.prefix
non è 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_prefix
viene aggiunto il valore di . Su Windows, sys.prefix
viene 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.path
i file di riferimento, come ha cercato di fare con la directory di in sys.executable
precedenza, finché non trova qualcosa. In caso contrario, sys.prefix
viene lasciato vuoto.
Alla fine, dopo tutto questo, Python carica il site
modulo, 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.prefix
e 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.