2009-05-22 4 views
68

Da dove viene inizializzato il sys.path di Python?Da dove viene inizializzato il sys.path di Python?

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'] 

mio PYTHONPATH è:

PYTHONPATH=c:\testdir 

Mi chiedo dove quei sentieri prima di quelli di PYTHONPATH vengono?

risposta

36

"inizializzata dalla variabile d'ambiente PYTHONPATH, oltre a un predefinito dipendente"

-http://docs.python.org/library/sys.html#sys.path

+5

Credo che provengono dal modulo sito: http://docs.python.org/library/site.html – ashcatch

+12

I carichi dei moduli del sito e analizza i contenuti dei file .pth nel vostro sito-pacchetti directory. Questi file .pth contengono aggiunte al tuo PYTHONPATH – ASk

29

Python cerca veramente difficile da impostare in modo intelligente sys.path. Come è possibile impostare reallycomplicated. La seguente guida è una guida incompleta, un po 'incompleta, un po' errata, ma si spera utile per il programmatore python rank-and-file di cosa succede quando python calcola cosa usare come valore iniziale di sys.path, sys.executable, sys.exec_prefix e sys.prefix su un normale installazione python.

In primo luogo, python è il suo livello migliore per capire la sua posizione fisica effettiva sul file system in base a ciò che dice il sistema operativo esso. Se il sistema operativo dice solo che "python" è in esecuzione, si trova in $ PATH. Risolve qualsiasi collegamento simbolico. Una volta eseguito, il percorso di l'eseguibile che trova viene utilizzato come valore per sys.executable, senza if, ands o buts.

Successivamente, determina i valori iniziali per sys.exec_prefix e sys.prefix.

Se esiste un file chiamato pyvenv.cfg nella stessa directory di sys.executable o una directory in alto, Python la guarda. Differenti sistemi operativi con questo file.

Uno dei valori in questo file di configurazione che python cerca è l'opzione di configurazione home = <DIRECTORY>. Python utilizzerà questa directory invece della directory contenente sys.executable quando imposta dinamicamente il valore iniziale di sys.prefix in seguito. Se l'impostazione applocal = true viene visualizzata nel file pyvenv.cfg su Windows, ma non nell'impostazione home = <DIRECTORY>, allora sys.prefix verrà impostato nella directory contenente sys.executable.

Successivamente, viene esaminata la variabile di ambiente . Su Linux e Mac, sys.prefix e sys.exec_prefix sono impostati alla variabile PYTHONHOME ambiente, se esiste, sostituendo qualsiasi home = <DIRECTORY> impostazione nel pyvenv.cfg.In Windows, sys.prefix e sys.exec_prefix è impostato alla variabile PYTHONHOME ambiente, se esiste, meno un'impostazione home = <DIRECTORY> è presente in pyvenv.cfg, che viene utilizzato invece.

In caso contrario, questi sys.prefix e sys.exec_prefix si trovano camminando a ritroso dalla posizione di sys.executable, o la directory home data dal pyvenv.cfg se del caso.

Se il file lib/python<version>/dyn-load si trova in quella directory o una delle sue 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 una delle sue sottodirectory , quella directory è impostato per essere sys.prefix su Linux, Mac , e Windows, con sys.exec_prefix insieme allo stesso valore di sys.prefix su Windows. L'intero passaggio viene saltato su Windows se è impostato applocal = true. O la directory di sys.executable è utilizzata o, se home è impostata in pyvenv.cfg, viene utilizzata invece 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 valore di "fallback". Linux e Mac, ad esempio, utilizzano valori predefiniti precompilati come i valori di sys.prefix e sys.exec_prefix. Windows attende fino a sys.path è completamente determinato per impostare un valore di riserva per sys.prefix.

Quindi, (quello che stavate aspettando), python determina i valori iniziali che devono essere contenuti in sys.path.

  1. La directory dello script in esecuzione in python viene aggiunta a sys.path. Su Windows, questa è sempre la stringa vuota, che dice a python di di utilizzare invece la directory di lavoro attuale.
  2. Il contenuto della variabile d'ambiente PYTHONPATH, se impostato, viene aggiunto al sys.path, a meno che non sei su Windows e applocal è impostata su true in pyvenv.cfg.
  3. Il percorso del file zip, che è <prefix>/lib/python35.zip su Linux/Mac e os.path.join(os.dirname(sys.executable), "python.zip") su Windows, viene aggiunto a sys.path.
  4. Se su Windows e applocal = true è stato impostato su pyvenv.cfg, vengono aggiunti, se presenti, i contenuti delle sottochiavi della chiave di registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\.
  5. Se su Windows e non è stato fissato in applocal = truepyvenv.cfg, e sys.prefix non è stato trovato, poi i contenuti fondamentali della della chiave di registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ viene aggiunto, se esiste;
  6. Se su Windows e applocal = true è stato impostato su pyvenv.cfg, vengono aggiunti, se presenti, i contenuti delle sottochiavi della chiave di registro HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\.
  7. Se su Windows e non è stato fissato in applocal = truepyvenv.cfg, e sys.prefix non è stato trovato, poi i contenuti fondamentali della della chiave di registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ viene aggiunto, se esiste;
  8. Se su Windows e PYTHONPATH non è stato impostato, il prefisso non è stato trovato e non sono presenti chiavi di registro, quindi viene aggiunto il valore di tempo di compilazione relativo di PYTHONPATH ; in caso contrario, questo passaggio viene ignorato.
  9. I percorsi nella macro in fase di compilazione PYTHONPATH vengono aggiunti rispetto allo sys.prefix trovato dinamicamente.
  10. Su Mac e Linux, è stato aggiunto il valore di sys.exec_prefix. Su Windows, la directory che è stata utilizzata (o sarebbe stata utilizzata) per la ricerca dinamica di sys.prefix è stata aggiunta a .

In questa fase su Windows, se è stato trovato alcun prefisso, allora Python cercherà di determinarlo con la ricerca tutte le directory in sys.path per i file di punto di riferimento, come ha cercato di fare con la directory di sys.executable precedentemente, fino a quando non trova qualcosa. In caso contrario, sys.prefix viene lasciato vuoto.

Infine, dopo tutto questo, Python carica il modulo site, che aggiunge roba ulteriormente a sys.path:

Si inizia costruendo fino a quattro directory da una testa e una parte coda. Per la parte principale, utilizza sys.prefix e sys.exec_prefix; Le testine vuote vengono saltate. Per la parte tail, 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 combinazioni distinte testa-coda , vede se si riferisce a una directory esistente e, in caso affermativo, la aggiunge a sys.path e controlla anche il nuovo percorso aggiunto per i file di configurazione.

+1

Nonostante ciò che i documenti dicono, 'sys.executable' può essere un link simbolico o in realtà può essere qualsiasi cosa se 'argv [0]' contiene barre. Il percorso * effettivo * all'eseguibile (dalla chiamata 'execv (path, argv)') non viene utilizzato. – jfs