Wie man PID über Teilprozess.Popen mit benutzerdefinierten Umgebungsvariablen?

Mithilfe von Python, wie kann ich einen Teilprozess mit einem geänderten Umgebungsvariablen und Holen Sie sich die PID? Ich gehe davon aus Teilprozess.Popen() ist auf der rechten Spur...

In der shell (bash), würde ich dies tun:

MY_ENV_VAR=value ./program_name arg1 arg2 etc &

Läuft program_name im hintergrund, übergehend in "arg1" und "arg2" und "etc", mit einer geänderten Umgebungsvariablen "MY_ENV_VAR" mit dem Wert "Wert". Das Programm program_name erfordert die Umgebungsvariable MY_ENV_VAR festgelegt werden, um den korrekten Wert.

Wie kann das gleiche Ding in Python? Ich brauche unbedingt die PID des Prozesses. (Meine Absicht ist es, halten Sie das python-Skript ausgeführt und Prüfungen auf einige der Dinge, die program_name ist zu tun in der Zwischenzeit, und ich brauche die Prozess-ID, um sicherzustellen, dass es immer noch läuft.)

Ich versucht habe:

proc = subprocess.Popen(['MY_ENV_VAR=value', './program_name', 'arg1', 'arg2', 'etc'])

Aber natürlich, es erwartet, dass die ersten Artikel auf das Programm, nicht eine Umgebungsvariable.

Habe auch versucht:

environ = dict(os.environ)
environ['MY_ENV_VAR'] = 'value'
proc = subprocess.Popen(['./program_name', 'arg1', 'arg2', 'etc', env=environ])

Schließen, nehme ich an, aber keine Zigarre. Ähnlich:

environ = dict(os.environ)
environ['MY_ENV_VAR'] = 'value'
proc = subprocess.Popen(['echo', '$MY_ENV_VAR'], env=environ)

Dieser echo "$MY_ENV_VAR" wörtlich, ich nehme an, weil es keine shell zu interpretieren. Okay, also ich versuchen, die oben, aber mit dieser Zeile statt:

proc = subprocess.Popen(['echo', '$MY_ENV_VAR'], env=environ, shell=True)

Und das ist schön und gut, außer, dass der Wert, der echo ist leer (nicht scheinbar vorhanden ist). Und selbst wenn es funktioniert hat, würd ich bekomme die PID der shell, nicht den eigentlichen Prozess, den ich versuche zu starten.

Brauche ich, um einen Prozess einzuleiten, mit dem eine benutzerdefinierte Umgebungsvariable und Holen Sie sich die PID (nicht die PID der shell). Ideen?

Sind Sie auf der wirklich sicher brauchen Sie eine Schale für Ihr real-world use-case? Sie brauchen es für den echo-test-Fall, sicher, aber Sie in der Regel würde nicht/nicht benutzen sollte es beim aufrufen der Ihr richtiges Programm.
Ich brauche nur die Schale, soweit das setzen/übergeben Sie die Umgebungsvariable für diesen Prozess geht. Wenn ich nicht brauchen, die shell, die ich lieber nicht verwenden. (Aber ich brauche Argumente, um das Programm und haben es im hintergrund laufen.)
Die environment-Variablen übergeben werden, um den Teilprozess in Ihrer proc = subprocess.Popen(['echo', '$MY_ENV_VAR'], env=environ) Beispiel; Teilprozess, dass einfach nicht alles tun, um Ihnen zu zeigen, dass Sie sind, weil echo schaut nie auf seine Umwelt. Versuchen subprocess.Popen(['env'], env=environ) statt.
D ' Oh! Das ist es. Sie und abarnet habe es mir etwa zur gleichen Zeit.
Übrigens, wenn Sie das "echte Programm" PID bei Verwendung shell=True (die, wieder, Sie sollten nicht immer verwenden, es sei denn, Sie wirklich wissen, was Sie tun), können Sie tun, indem Sie das shell-Skript aufrufen, der Letzte Befehl mit exec. Für dieses Beispiel: exec echo "$MY_ENV_VAR"; dies bewirkt, dass der echo-Befehl ersetzt den shell-Prozess erbt die PID.

InformationsquelleAutor Matt | 2013-04-03

Schreibe einen Kommentar