Python: niezależny od platformy sposób modyfikowania zmiennej środowiskowej PATH

89

Czy istnieje sposób na zmodyfikowanie PATHzmiennej środowiskowej w sposób niezależny od platformy przy użyciu Pythona?

Coś podobnego do os.path.join()?

resi
źródło

Odpowiedzi:

170

Powinieneś móc modyfikować os.environ.

Ponieważ os.pathsepjest to znak oddzielający różne ścieżki, powinieneś użyć tego, aby dołączyć każdą nową ścieżkę:

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

lub, jeśli istnieje kilka ścieżek do dodania na liście:

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

Jak wspomniałeś, os.path.joinmoże być również używany dla każdej indywidualnej ścieżki, którą musisz dołączyć, w przypadku, gdy musisz je zbudować z oddzielnych części.

RedGlyph
źródło
Co z separatorami środowiska PATH? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
bua
2
@bua: czy masz na myśli os.pathsepwspomniane przeze mnie (specyficzne dla PATH)?
RedGlyph
@RedGlyph Tak, przepraszam, myślałem, że os.pathsep to „/” i „\”. Nie sprawdziłem tego przed zgłoszeniem;).
bua
11
@bua: To prawie "gotcha" os.path.sep != os.pathsep.
krawyoti
@krawyoti, bua: Ach, teraz widzę ... dobrze zauważony! To naprawdę łatwy błąd :-)
RedGlyph
17

Należy pamiętać, że w os.environrzeczywistości nie jest to słownik. Jest to specjalny obiekt podobny do słownika, który faktycznie ustawia zmienne środowiskowe w bieżącym procesie za pomocą setenv .

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

Oznacza to, że PATH(i inne zmienne środowiskowe) będą widoczne dla kodu C uruchamianego w tym samym procesie.

(Ponieważ komentarze nie mogą zawierać formatowania, muszę umieścić to w odpowiedzi, ale czuję, że jest to ważna kwestia. To jest tak naprawdę komentarz dotyczący komentarza, że ​​nie ma odpowiednika „eksportu” ).

Glif
źródło
6

Zastrzeżenie, o którym należy pamiętać podczas modyfikowania zmiennych środowiskowych w Pythonie, polega na tym, że nie ma odpowiednika polecenia powłoki „eksport”. Nie ma możliwości wprowadzania zmian do bieżącego procesu, tylko procesy potomne.

Matt T.
źródło
+1: mądry, aby wskazać, że z polecenia podoba os.system, os.popenczy subprocess.Popenpowinny być następnie wykorzystane z aplikacji Pythona do uruchomienia innych procesów. W przeciwnym razie jest to bezcelowe.
RedGlyph
14
To nie jest prawda.
Glyph
4
Wyjaśnienie stwierdzenia Glypha: to nieprawda, ponieważ zmiany wprowadzane do bieżącego procesu (który jest procesem Pythona). OP prawdopodobnie oznaczało, że nie ma możliwości wprowadzenia zmian do procesu nadrzędnego (zwykle jest to powłoka, z której został wykonany skrypt Pythona).
PonyEars
4
Jeśli to właśnie oznacza OP, to powłoka również nie ma tej możliwości; exportpowoduje skopiowanie zmiennej do środowiska wszystkich procesów potomnych , ale nie ma wpływu na proces nadrzędny.
Kyle Strand