Python: Plattformunabhängige Methode zum Ändern der Umgebungsvariablen PATH

Antworten:

167

Sie sollten in der Lage sein zu ändern os.environ.

Da os.pathsepes sich bei dem Zeichen um das Trennen verschiedener Pfade handelt, sollten Sie dies verwenden, um jeden neuen Pfad anzuhängen:

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

oder, wenn einer Liste mehrere Pfade hinzugefügt werden müssen:

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

Wie Sie bereits erwähnt haben, os.path.joinkann es auch für jeden einzelnen Pfad verwendet werden, den Sie anhängen müssen, falls Sie sie aus separaten Teilen erstellen müssen.

RedGlyph
quelle
Was ist mit PATH-Umgebungstrennzeichen? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
Bua
2
@bua: meinst du das, was os.pathsepich erwähnt habe (spezifisch für PATH)?
RedGlyph
@ RedGlyph Ja, tut mir leid, ich dachte, dass os.pathsep "/" und "\" ist. Ich habe das nicht überprüft, bevor ich behauptet habe;).
Bua
11
@bua: Es ist fast ein "Gotcha" das os.path.sep != os.pathsep.
Krawyoti
@krawyoti, bua: Ah, jetzt sehe ich ... gut entdeckt! Es ist in der Tat ein leichter Fehler :-)
RedGlyph
17

Bitte beachten Sie, dass os.environdies eigentlich kein Wörterbuch ist. Es ist ein besonderer dictionary- wie Objekt , das tatsächlich Umgebungsvariablen im aktuellen Prozess setzt mit setenv .

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

Dies bedeutet , dass PATH(und andere Umgebungsvariablen) wird im gleichen Prozess zu C - Code ausführen sichtbar.

(Da Kommentare keine Formatierung enthalten können, muss ich dies in eine Antwort einfügen, aber ich denke, es ist ein wichtiger Punkt. Dies ist wirklich ein Kommentar zu dem Kommentar, dass es kein Äquivalent zu 'Export' gibt .)

Glyphe
quelle
6

Die Einschränkung beim Ändern von Umgebungsvariablen in Python besteht darin, dass es kein Äquivalent zum Shell-Befehl "export" gibt. Es gibt keine Möglichkeit, Änderungen in den aktuellen Prozess einzufügen, sondern nur untergeordnete Prozesse.

Matt T.
quelle
+1: Wise , dass die darauf hinweist, Befehle wie os.system, os.popenoder subprocess.Popensollte dann von der Python - Anwendung verwendet werden , um andere Prozesse zu starten. Ansonsten ist es ziemlich sinnlos.
RedGlyph
14
Das ist nicht wahr.
Glyphe
4
Klarstellung der Aussage von Glyph: Dies ist nicht wahr, weil sich ändert werden in den aktuellen Prozess injiziert (was der Python - Prozess). OP bedeutete wahrscheinlich, dass es keine Möglichkeit gibt, Änderungen in den übergeordneten Prozess einzufügen (dies ist normalerweise eine Shell, von der aus das Python-Skript ausgeführt wurde).
PonyEars
4
Wenn dies OP bedeutet, verfügt die Shell auch nicht über diese Funktion. exportbewirkt, dass eine Variable in die Umgebung aller untergeordneten Prozesse kopiert wird, hat jedoch keine Auswirkungen auf den übergeordneten Prozess.
Kyle Strand