Schnittstelle zum ändern von Windows Umgebungsvariablen von Python
Wie kann ich beharrlich, ändern Sie die Windows-Umgebungsvariablen aus einem Python-Skript? (es ist das setup.py Skript)
Ich bin auf der Suche nach einer standard-Funktion oder ein Modul für diesen Einsatz. Ich bin bereits vertraut mit dem Registrierung Weg, es zu tun, aber alle Kommentare zu, die sind auch willkommen.
- Meinst du hartnäckig Umgebungsvariablen (wie die 'setx' Befehl) oder die änderung für den aktuellen Prozess (wie die 'set' - Befehl)? Die Tatsache, dass es ist ein Rezept von ActiveState deutet darauf hin, dass es nicht ein standard-Modul, es sei denn, es ist eine sehr neue, nehme ich an.
- Ja, beharrlich, ich habe aktualisiert die Frage
- Duplizieren: stackoverflow.com/questions/263005/...
- Nicht wirklich ein Duplikat ist. Diese Frage ist speziell für die bash-Shell unter Linux, und das ist speziell für Windows. Auch dieser Fragesteller hat nicht gesagt, ob es die Umgebung des übergeordneten Prozesses oder der zukünftigen Prozesse, die Bedürfnisse ändern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit setx hat einige Nachteile, vor allem, wenn Sie versuchen, anfügen", um die Umgebungsvariablen (wie zB. setx PATH %Path%;C:\mypath), wird Dieser immer wieder "anfügen", um den Pfad jedes mal, wenn Sie es ausführen, kann ein problem sein. Schlimmer noch, es unterscheidet nicht zwischen der Maschine Weg (gespeichert in HKEY_LOCAL_MACHINE) und den user-Pfad (in HKEY_CURRENT_USER gespeichert). Die Umgebungsvariablen an, die Sie sehen, an einer Eingabeaufforderung aus einer Verkettung dieser beiden Werte. Daher vor dem Aufruf von setx:
Den system-Pfad ist unvermeidlich dupliziert in der %PATH% - Umgebungsvariable bei jedem Aufruf setx auf an PFAD anfügen. Diese Veränderungen sind dauerhaft, nie zurückgesetzt wird neu gestartet, und so sammeln sich über die Lebensdauer der Maschine.
Versucht, den Ausgleich im DOS ist jenseits meiner Fähigkeit. So wandte ich mich an Python. Die Lösung, die ich habe kommen mit heute, ist das setzen von Umgebungsvariablen durch optimieren der Registrierung, einschließlich Anhängen WEG, ohne dass Duplikate, ist wie folgt:
Es hat keinen Einfluss auf den aktuellen Prozess oder die Eltern-shell, aber es wirkt sich auf alle cmd-Fenster geöffnet, nachdem Sie es ausführen, ohne einen Neustart, und kann problemlos bearbeitet werden und erneut ausführen, viele Male, ohne dass irgendwelche Duplikate.
setx
standardmäßig setzt HKCU, aber Sie könnensetx /M
zu setzen, HKLM.Kann es nur so einfach, um die externe Windows
setx
Befehl:Nun öffnen Sie eine neue Eingabeaufforderung:
Wie Sie sehen können,
setx
weder wird die variable für die aktuelle Sitzung, noch für den parent-Prozess (in der ersten Eingabeaufforderung). Aber es funktioniert, legen Sie die variable hartnäckig in der registry für zukünftige Prozesse.Ich glaube nicht, dass es eine Möglichkeit der änderung der übergeordnete Prozess, der die Umgebung (und wenn es ist, ich würde es gerne hören!).
Es muss ein Jahrtausend her, dass ich versucht habe, die Umgebung ändern des aktuellen DOS-Sitzung mit Hilfe eines Programms. Das problem ist: das Programm läuft in seinem eigenen DOS-shell, so hat es zu funktionieren auf seinem übergeordneten Umwelt. Es dauert ein Spaziergang, beginnend an der die DOS-Info-Block, alle entlang der chain of Memory Control Blocks, um den Speicherort des übergeordneten Umwelt. Einmal hatte ich herausgefunden, wie dies zu tun, mein Bedürfnis nach Manipulation environment-Variablen verschwunden war. Ich gebe Ihnen das Turbo-Pascal-code unten, aber ich denke, es gibt mindestens drei bessere Wege, um den trick zu tun:
Erstellen Sie eine batch-Datei: (a) fordert ein Python-script (oder was auch immer) erzeugt temporary batch-Datei mit den entsprechenden SET-Befehle; (b) ruft die temporäre batch-Datei (die SET-Befehle werden ausgeführt in der aktuellen shell); und (c) entfernt die temporäre batch-Datei.
Erstellen Sie ein Python Skript, das etwas schreibt wie "VAR1=val1\nVAR2=val2\nVAR3=val3\n") auf STDOUT aus. Diese Art der Nutzung in Ihrem batch-Datei:
for /f "delims=|" %%X in ('
callYourPythonScript') do set %%X
et voilà: die Variablen VAR1, VAR2 und VAR3 haben schon einen Wert.
Die Windows-Registry ändern und die broadcast-Einstellung ändern, wie beschrieben hier von Alexander Prokofyev.
- Und hier geht der Pascal-code (Sie können ein Niederländisches Wörterbuch und ein Pascal-Programmierung Buch) von einem Programm, das einfach Berichte Speicherplätze. Es scheint immer noch zu funktionieren unter Windows XP, werden it-reporting wir laufen DOS 5.00. Dies ist nur ein Erster Anfang, es gibt eine Menge von low-level-Programmierung zu tun, um zu manipulieren, um die ausgewählte Umgebung. Und als der Zeiger-Struktur zu sein scheint, bin ich mir nicht so sicher, ob die Umwelt-Modell von 1994 hält immer noch diese Tage...
(Oberhalb von ASCII 127, kann es einige ASCII - /ANSI-übersetzung-Themen in dieser Präsentation.)
Die registry Weg ist, wenn Sie ändern möchten, ist es dauerhaft für alles, was ich denke, ist, was Sie hier wollen, da es in setup.py.
Vorübergehend nur für den Prozess, dann os.environ ist der trick.
In das os-Modul gibt es getenv und putenv Funktionen. Es scheint jedoch, dass die putenv nicht korrekt funktioniert und, dass Sie müssen verwenden Sie die windows-registry statt
Blick auf diese Diskussion
Diesem Python-script[*] versuche zum ändern der GLOBALEN env-vars in der registry, wenn keine Berechtigungen, fällt zurück auf die Benutzer-registry und benachrichtigt dann alle windows über die änderung:
Nachfolgend einige Beispiele, vorausgesetzt, es wurde gespeichert in einer Datei namens
setenv.py
irgendwo in Ihrem aktuellen Pfad.Beachten Sie, dass in diesen Beispielen, die ich nicht über admin-Rechte, damit die änderungen betroffen, nur meine lokale Benutzer-registry-Baum:
[*] Adaptiert von: http://code.activestate.com/recipes/416087-persistent-environment-variables-on-windows/