2009-11-05 7 views

risposta

110

Dovresti essere in grado di modificare os.environ.

Dal os.pathsep è il carattere per separare percorsi diversi, è necessario utilizzare questo per aggiungere ogni nuovo percorso:

os.environ["PATH"] += os.pathsep + path 

o, se ci sono diversi percorsi per aggiungere in un elenco:

os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist) 

Come già accennato, è possibile utilizzare os.path.join per ogni singolo percorso da aggiungere nel caso in cui sia necessario costruirli da parti separate.

+0

Che con separatori d'ambiente PATH ? ? linux -/usr/bin:/lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";" – bua

+2

@bua: intendi il 'os.pathsep' di cui ho parlato (specifico per PATH)? – RedGlyph

+0

Grazie, questo è quello che stavo cercando. – resi

6

L'avvertenza da prendere in considerazione con la modifica delle variabili di ambiente in Python, è che non esiste un equivalente del comando di shell "export". Non c'è modo di iniettare modifiche nel processo corrente, solo i processi figli.

+0

+1: è opportuno indicarlo, comandi come 'os.system',' os.popen' o 'subprocess.Popen' devono quindi essere utilizzati dall'applicazione Python per avviare altri processi. Altrimenti è praticamente inutile. – RedGlyph

+8

Questo non è vero. – Glyph

+3

Chiarimento dell'istruzione di Glyph: questo non è vero perché le modifiche * sono * iniettate nel processo corrente (che è il processo python). Probabilmente OP significava che non c'era modo di iniettare modifiche nel processo genitore (che di solito è una shell da cui è stato eseguito lo script python). – PonyEars

14

Si prega di notare che os.environ non è in realtà un dizionario. È un dizionario speciale - come l'oggetto che imposta effettivamente le variabili di ambiente nel processo corrente utilizzando setenv.

>>> os.environ.__class__ 
<class os._Environ at 0x100472050> 
>>> import os 
>>> os.environ["HELLO"] = "WORLD" 
>>> os.getenv("HELLO") 
'WORLD' 

Ciò significa che PATH (o qualche altra variabile) sarà visibili per eseguire codice C nello stesso processo.

(Dal momento che i commenti non possono contenere la formattazione, devo mettere questo in una risposta, ma mi sento come se fosse un punto importante da fare. Questo è veramente un commento su the comment about there being no equivalent to 'export'.)