2008-11-04 5 views
15

In Linux Wenn ich Python von der Shell aufrufen repliziert es seine Umgebung und startet den Python-Prozess. Deshalb, wenn ich so etwas wie das folgende tun:Ist es möglich, die Umgebung eines Elternprozesses in Python zu ändern?

import os 
os.environ["FOO"] = "A_Value" 

Wenn die Python-Prozess kehrt, FOO, vorausgesetzt, es war nicht definiert ursprünglich, noch nicht definiert werden. Gibt es eine Möglichkeit für den Python-Prozess (oder einen untergeordneten Prozess), die Umgebung seines übergeordneten Prozesses zu ändern?

Ich weiß, dass Sie in der Regel dieses Problem lösen, mit so etwas wie

source script_name.sh 

Aber diese Konflikte mit anderen Anforderungen habe ich.

+0

Sehen Sie diese ähnliche Frage: http://stackoverflow.com/questions/205064/is-there-a-way-to-change-another-processs-environment-variables – Davide

+0

Andrew aus diesem Thread beantwortet: Via gdb: (GDB) befestigen process_id (GDB) Aufruf putenv ("env_var_name = env_var_value") (GDB) löst Dies ist ein ganz gemeiner Hack und soll nur im Zusammenhang mit einem Debug-Szenario durchgeführt werden, natürlich . – grieve

Antwort

14

Kein Prozess kann seinen übergeordneten Prozess (oder die Umgebung eines anderen vorhandenen Prozesses) ändern.

Sie können jedoch eine neue Umgebung erstellen, indem Sie eine neue interaktive Shell mit der geänderten Umgebung erstellen.

Sie müssen eine neue Kopie der Shell spawnen, die die aktualisierte Umgebung verwendet und Zugriff auf die vorhandenen stdin, stdout und stderr hat und ihre Reinitialisierung tanzt.

Sie müssen etwas wie subprocess.Popen tun, um /bin/bash -i auszuführen.

Also die ursprüngliche Shell läuft Python, die eine neue Shell ausführt. Ja, Sie haben viele Prozesse ausgeführt. Nein, es ist nicht so schlimm, weil die ursprüngliche Shell und Python nichts tun, außer darauf zu warten, dass die Subshell beendet wird, damit sie auch sauber beenden können.

+0

Ja, das mache ich gerade. Ich habe versucht, diesen Reinitialisierungs-Tanz zu vermeiden. – grieve

+0

Ich habe Ihren Post bearbeitet, indem Sie einige kleinere Tippfehler korrigiert und einen Kommentar in Klammern hinzugefügt haben (Sie könnten ihn entfernen, wenn Sie nicht zustimmen) – tzot

+1

Ändern eines "bestehenden" Prozesses - obwohl wahr - tangential ist. Das Ändern des Elternprozesses verwirrt alle. Es ist für Leute nicht klar, dass alle * nix-Befehle in einem Subprozess laufen. –

13

Es ist nicht möglich, für jeden untergeordneten Prozess die Umgebung des übergeordneten Prozesses zu ändern. Das Beste, was Sie tun können, ist die Ausgabe von Shell-Anweisungen an stdout, die Sie dann als Quelle verwenden, oder Sie schreiben sie in eine Datei, die Sie im übergeordneten Element bereitstellen.

10

würde ich die Bash-eval-Anweisung verwenden und die Python-Skript-Ausgabe der Shell-Code haben

child.py:

#!/usr/bin/env python 
print 'FOO="A_Value"' 

parent.sh

#!/bin/bash 
eval `./child.py` 
Verwandte Themen