Seite 1 von 1

Programmaufruf aus Python

Verfasst: Dienstag 20. Mai 2008, 14:58
von hmueller
Hallo!

Ich verwende derzeit subprocess.Popen, um aus meinem Programm ein anderes zu starten.

Wie kann ich mein Programm so starten, dass wenn ich das startende Programm beende, es wirklich vollständig beendet wird und nicht auf das Beenden des gestarteten Programms wartet?

Ich hoffe das war jetzt nicht so unverständlich wie sich das jetzt für mich liest.

Verfasst: Dienstag 20. Mai 2008, 17:20
von lunar
Also folgender Ablauf:

Python-Skript -> Unterprozess -> AndereUnterprozess

Du möchtest jetzt "Unterprozess" so beenden, dass er nicht auf "AndererUnterprozess" wartet? Habe ich das richtig verstanden?

Verfasst: Mittwoch 21. Mai 2008, 06:58
von hmueller
fast :)

python-skript -> programm

wenn ich mein skript beende, und das gestartete programm (über os.system oder subprocess.Popen) läuft noch, dann bleibt das skript noch unter den laufenden Prozessen.

ich würde das programm gern so starten, dass es unabhängig läuft, damit es keine probleme gibt, wenn ich während der laufzeit des gestarteten Programms nochmal das Skript starte.

klarer?

Verfasst: Mittwoch 21. Mai 2008, 09:20
von lunar
``subprocess.Popen`` ruft den Prozess schon asynchron auf, du darfst halt nur nicht ``wait`` oder ``communicate`` aufrufen ;)

Verfasst: Mittwoch 21. Mai 2008, 09:30
von hmueller
trotzdem ist das Skript aber noch in der Prozessliste aufgeführt. Das ist mir schon klar, dass es asynchron ist, es laufen ja beide unabhängig von einander. nur wenn ich das Skript beende, lässt es sich eben nicht vollständig schliessen und ich komme in die potentielle Situation, dass Ressourcen noch nicht voll freigegeben sind.

Verfasst: Mittwoch 21. Mai 2008, 09:36
von lunar
Sicher, dass das nicht nur ein Zombie ist?

Verfasst: Mittwoch 21. Mai 2008, 09:48
von hmueller
Erkennt man unter Windows Zombieprozesse?

Unter Linux gibt's ja sowas wie den system call "disown" oder so, um childprozesse nicht mehr als kind zu führen - das würde das Problem lösen.

Aufgefallen ist es dadurch, dass in diesem fall ein port, der benutzt wird, noch nciht freigegeben wurde, da wir den nicht beim beenden programmatisch freigeben; dann müssen wir halt einen cleanup beim shutdown machen. Also nicht tragisch, aber sollte jemand eine Idee haben, wäre das natürlich toll, da ja noch Speicher belegt wird bis das child fertig ist.

Verfasst: Mittwoch 21. Mai 2008, 09:55
von lunar
Wenn's um Windows geht, bin ich der falsche Ansprechpartner ;)

Edit:
Btw, bist du *sicher*, dass der Kindprozess der Verursacher ist, und nicht ein laufender syscall, oder ähnliches? Dafür spricht auch, dass der Port nicht freigegeben wird, was der Fall sein sollte, wenn nur die Einträge in der Prozesstabelle zurückblieben. Der Port nämlich hat mit den Verwaltungsinformationen des Prozesses nichts zu tun.

Ich habe das gerade mit einem Aufruf von wget getestet, unter Linux verschwindet *python* sofort aus der Prozessliste, während wget munter weiter lädt.

Zombie war eh verehrt, dass ist die umgekehrte Richtung: Kind bleibt in der Prozesstabelle, weil Vater den Exit-Status nicht abruft ;)