Dove si trova sys.path di Python inizializzato da?
Domanda
In caso di sys.path di Python inizializzato da?
UPD : Python è l'aggiunta di alcuni percorsi prima riferendosi al PYTHONPATH:
>>> 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']
Il mio PYTHONPATH è:
PYTHONPATH=c:\testdir
Mi chiedo dove quei sentieri prima di quelli di PYTHONPATH vengono?
Soluzione
"inizializzato dalla variabile d'ambiente PYTHONPATH, oltre a un predefinito dipendente"
Altri suggerimenti
Python cerca veramente difficile da impostare in modo intelligente sys.path
. Com'è
set può ottenere davvero complicato . La seguente è una guida annacquata,
guida un po 'incompleto, in qualche modo, sbagliato, ma si spera-utile
per il rango e file python programmatore di ciò che accade quando pitone
capisce cosa usare come valori iniziali di sys.path
,
sys.executable
, sys.exec_prefix
, e sys.prefix
su un normale
installazione di Python.
In primo luogo, pitone fa del suo meglio per capire la sua effettiva fisica
posizione sul filesystem base a ciò che dice al sistema operativo
esso. Se il sistema operativo dice solo "python" è in esecuzione, si trova in $ PATH.
Risolve tutti i collegamenti simbolici. Una volta fatto questo, il percorso di
l'eseguibile che trova è utilizzato come valore per sys.executable
, senza se,
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 up, pitone lo guarda. Diverso
Sistemi operativi 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 che la directory contenente sys.executable
quando imposta dinamicamente il valore iniziale di sys.prefix
tardi. Se l'impostazione applocal = true
appare nella
file di pyvenv.cfg
su Windows, ma non l'impostazione home = <DIRECTORY>
,
allora sys.prefix
sarà impostato alla directory contenente sys.executable
.
Successivamente, la variabile di ambiente PYTHONHOME
viene esaminato. Su Linux e Mac,
sys.prefix
e sys.exec_prefix
sono impostati per la variabile di ambiente PYTHONHOME
, se
esiste, sostituendo ogni ambiente home = <DIRECTORY>
in pyvenv.cfg
. Su Windows,
sys.prefix
e sys.exec_prefix
è impostata la variabile di ambiente PYTHONHOME
,
se esiste, meno un ambiente home = <DIRECTORY>
è presente in pyvenv.cfg
,
che viene utilizzato al posto.
In caso contrario, questi sys.prefix
e sys.exec_prefix
si trovano camminando all'indietro
dalla posizione di sys.executable
, o la directory home
data dal pyvenv.cfg
se del caso.
Se il lib/python<version>/dyn-load
file si trova nella directory
o uno dei suoi directory padre, tale directory è impostato per essere per essere
sys.exec_prefix
su Linux o Mac. Se il file
lib/python<version>/os.py
si è trovato nella directory o uno qualsiasi dei suoi
sottodirectory, quella directory è impostato per essere sys.prefix
su Linux,
Mac e Windows, con sys.exec_prefix
insieme per lo stesso valore
sys.prefix
su Windows. Tutto questo passaggio viene saltato su Windows se
applocal = true
è impostato. O la directory di sys.executable
è
utilizzati o, se home
occupa pyvenv.cfg
, che viene utilizzato preferibilmente per
il valore iniziale di sys.prefix
.
Se non riesce a trovare questi file "punto di riferimento" o sys.prefix
non è stato
ancora trovato, quindi imposta pitone sys.prefix
ad un "ripiego"
valore. Linux e Mac, per esempio, utilizzare le impostazioni predefinite precompilati come il
valori di sys.prefix
e sys.exec_prefix
. attese di Windows
fino sys.path
è completamente capito per impostare un valore di ripiego per
sys.prefix
.
Quindi, (quello che hai tutti aspettando,) python determina i valori iniziali
che devono essere contenuti in sys.path
.
- La directory dello script che è in esecuzione pitone viene aggiunto a
sys.path
. Su Windows, questo è sempre la stringa vuota, che racconta pitone a utilizzare il percorso completo in cui lo script si trova invece. - Il contenuto della variabile d'ambiente PYTHONPATH, se impostato, viene aggiunto al
sys.path
, meno tu sei su Windows eapplocal
è impostata su true inpyvenv.cfg
. - Il percorso del file zip, che viene
<prefix>/lib/python35.zip
su Linux / Mac eos.path.join(os.dirname(sys.executable), "python.zip")
su Windows, viene aggiuntosys.path
. - Se su Windows e non
applocal = true
è stato fissato inpyvenv.cfg
, poi i contenuti delle sottochiavi della chiave di registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
vengono aggiunti, se del caso. - Se su Windows e non
applocal = true
è stato fissato inpyvenv.cfg
, esys.prefix
non è stato trovato, si aggiunge quindi contenuti principali del del registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
chiave, se esiste; - Se su Windows e non
applocal = true
è stato fissato inpyvenv.cfg
, poi i contenuti delle sottochiavi della chiave di registroHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
vengono aggiunti, se del caso. - Se su Windows e non
applocal = true
è stato fissato inpyvenv.cfg
, esys.prefix
non è stato trovato, si aggiunge quindi contenuti principali del del registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
chiave, se esiste; - Se su Windows, e PYTHONPATH non è stato impostato, il prefisso non è stato trovato, e non le chiavi di registro erano presenti, poi la viene aggiunto valore relativo tempo di compilazione di PYTHONPATH; in caso contrario, questo passaggio viene ignorato.
- Percorsi nella fase di compilazione macro PYTHONPATH vengono aggiunti rispetto al
sys.prefix
dinamicamente ritrovata. - Su Mac e Linux, si aggiunge il valore di
sys.exec_prefix
. Su Windows, la directory che è stato utilizzato (o sarebbe stato utilizzato) per cercare in modo dinamico persys.prefix
è aggiunto.
In questa fase su Windows, se è stato trovato alcun prefisso, allora Python cercherà di
determinarlo con la ricerca tutti le directory in sys.path
per i file di punto di riferimento,
come ha cercato di fare con la directory di sys.executable
in precedenza, finché non trova qualcosa.
In caso contrario, sys.prefix
viene lasciato vuoto.
Infine, dopo tutto questo, Python carica il modulo site
, che aggiunge roba ancora più a sys.path
:
Si inizia con la costruzione di un massimo di quattro directory da una testa e un parte della coda. Per la parte di testa, utilizza
sys.prefix
esys.exec_prefix
; teste vuote vengono saltati. Per la parte di coda, si utilizza la stringa vuota e poilib/site-packages
(su Windows) olib/pythonX.Y/site-packages
e poilib/site-python
(su Unix e Macintosh). Per ciascuna delle distinte combinazioni testa-coda, si vede se si riferisce ad un esistente directory, e in caso affermativo, lo aggiunge a sys.path e ispeziona anche il neo percorso aggiunto per i file di configurazione.