2016-06-10 12 views
1

Ich habe ein Python-Programm, das ein neues Python-Skript in einem neuen Terminal erstellen und ausführen wird. Um dies zu tun, benutze ich subprocess.Popen. Ich versuche, die PID des neuen Prozesses mit .pid zu bekommen. Der Wert dieser PID scheint jedoch nicht mit der tatsächlichen PID des neu erstellten Prozesses übereinzustimmen (die beiden Werte stimmen nicht überein).Erhalte den Status eines Python-Prozesses, der in einem anderen Terminal ausgeführt wurde

Hier ist eine Probe von meinem Code:

from subprocess import Popen 

p = Popen("gnome-terminal -e 'python'",shell = True) 
print p.pid 

In dem neu eröffneten Terminal, ich versuche, die pid zu erhalten mit:

import os 
print os.getpid() 

Ich erhalte zwei verschiedene Werte. Kann jemand das richtige Pid bekommen? Ich muss dies wissen, wenn der zweite Prozess abgeschlossen ist, um eine Aktion im ersten Prozess zu machen.

Danke für Ihre Hilfe!

Wenn Sie weitere Informationen benötigen, bitte lassen Sie mich wissen :)

Antwort

0

Allerdings benötigen, ist der Wert dieses pid nicht die reale pid des neu geschaffenen Prozess zu entsprechen scheint (die beiden Werte nicht übereinstimmen).

Es gibt drei Prozesse hier: shell=True/bin/sh das läuft gnome-terminal laufen verursacht, die python läuft (vielleicht indirekt). gnome-terminal ist möglicherweise nur ein Startprogramm, das das Starten von python an einen laufenden Serverprozess delegiert und beendet.

shell=False wird hier nicht helfen. Sie erhalten die PID von gnome-terminal anstelle von /bin/sh - Sie erhalten keinen python Prozess 'pid.

Sie könnten die PID in eine bekannte Datei schreiben oder über Pipe/Socket kommunizieren.

+0

Das stimmt! Was ich getan habe ist, dass ich die PID des neuen Prozesses in eine Textdatei geschrieben habe und dann habe ich diese Datei im alten Prozess geöffnet, um den Status des erstellten Terminals zu überwachen. Es ist ein bisschen kompliziert, aber es funktioniert zumindest. Wie kann ich dies über Rohr/Steckdose tun? Ist es einfacher? –

+0

@Eliekhalifeh: Was zu verwenden ist, hängt von Ihrem Anwendungsfall ab. Wenn eine einfache Textdatei für Sie arbeitet (z. B. kein Risiko eines gleichzeitigen Zugriffs, wenn zwei oder mehr Python-Prozesse sie überschreiben, bevor Ihre übergeordneten Python-Skripts die entsprechenden PIDs lesen können), verwenden Sie sie. Der Code für eine benannte Pipe sieht fast identisch aus, aber es werden keine Daten auf die Festplatte geschrieben (und daher ist die PID nicht verfügbar, wenn das übergeordnete Python-Skript nach dem Lesen abbricht). Unix-Sockets ermöglichen beide Wege zu kommunizieren (Eltern <-> Kind Python-Skripte). tcp/udp-Sockets ermöglichen die Kommunikation zwischen verschiedenen Maschinen (z. B. über das Internet). – jfs

+0

@ j-f-sebastian Es scheint komplizierter! Die Textdatei, die ich erstelle, wird gelöscht, sobald der Elternteil stirbt, so dass keine Dateien auf dem Datenträger gespeichert werden.Haben Sie einen Link, wo ich sehen kann, wie Unix-Sockets verwendet werden können? Vielen Dank! Ich werde deine Antwort akzeptieren, da sie nützlicher ist als die andere! –

0

der documentation Laut.

Wenn Sie das Shell-Argument auf True setzen, ist dies die Prozess-ID der erzeugten Shell.

So werden Sie shell=False

+0

Gibt es eine Möglichkeit, dies mit Shell = True zu tun? –

+0

Ok, danke! Ich werde deine Antwort akzeptieren, da es das Problem gelöst hat! –

+0

Ich habe es gerade versucht. Es scheint nicht Arbeit mit Shell = False entweder! –