Python: modo indipendente dalla piattaforma per modificare la variabile d'ambiente PATH


Risposte:


174

Dovresti essere in grado di modificare os.environ.

Poiché os.pathsepè il carattere a separare percorsi diversi, dovresti usarlo per aggiungere ogni nuovo percorso:

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

oppure, se sono presenti più percorsi da aggiungere in un elenco:

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

Come hai detto, os.path.joinpuò essere utilizzato anche per ogni singolo percorso che devi aggiungere nel caso in cui devi costruirli da parti separate.


Cosa succede con i separatori di ambiente PATH? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
bua

2
@bua: intendi quello che os.pathsepho citato (specifico per PATH)?
RedGlyph,

@ RedGlyph Sì, mi dispiace, pensavo che os.pathsep fosse "/" e "\". Non l'ho verificato prima di richiedere;).
bua

11
@bua: è quasi un "gotcha" quello os.path.sep != os.pathsep.
krawyoti

@krawyoti, bua: Ah, ora vedo ... ben individuato! È davvero un errore facile :-)
RedGlyph

18

Tieni presente che in os.environrealtà non è un dizionario. È uno speciale oggetto simile a un dizionario 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(e altre variabili di ambiente) saranno visibili al codice C eseguito nello stesso processo.

(Dal momento che i commenti non possono contenere la formattazione, devo metterlo in una risposta, ma sento che è un punto importante da sottolineare. Questo è davvero un commento sul commento sul fatto che non esiste alcun equivalente a "export" .)


6

L'avvertenza da tenere presente quando si modificano le variabili di ambiente in Python è che non esiste un equivalente del comando di shell "export". Non è possibile inserire modifiche nel processo corrente, solo processi figlio.


+1: Wise farlo notare, comandi come os.system, os.popeno subprocess.Popendeve essere utilizzata dall'applicazione Python per lanciare altri processi. Altrimenti è praticamente inutile.
RedGlyph,

4
Chiarimento dell'affermazione di Glyph: questo non è vero perché le modifiche vengono iniettate nel processo corrente (che è il processo Python). OP probabilmente significava che non c'era modo di iniettare modifiche nel processo genitore (che in genere è una shell da cui è stato eseguito lo script python).
PonyEars

4
Se questo è ciò che significa OP, anche la shell non ha questa capacità; exportfa sì che una variabile venga copiata nell'ambiente di tutti i processi figli , ma non ha alcun effetto sul processo genitore.
Kyle Strand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.