Programmaufruf aus Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Dienstag 20. Mai 2008, 14:58

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.
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
lunar

Dienstag 20. Mai 2008, 17:20

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?
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Mittwoch 21. Mai 2008, 06:58

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?
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
lunar

Mittwoch 21. Mai 2008, 09:20

``subprocess.Popen`` ruft den Prozess schon asynchron auf, du darfst halt nur nicht ``wait`` oder ``communicate`` aufrufen ;)
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Mittwoch 21. Mai 2008, 09:30

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.
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
lunar

Mittwoch 21. Mai 2008, 09:36

Sicher, dass das nicht nur ein Zombie ist?
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Mittwoch 21. Mai 2008, 09:48

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.
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
lunar

Mittwoch 21. Mai 2008, 09:55

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 ;)
Antworten