Auf Prozessende warten

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
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Hallo, ich verwende eine Bibliothek, welche in einer Methode ein externes Programm aufruft.
Ich erhalte keine PID von dem erstellten Prozess,

Ich muss aber dringend warten, bis der Prozess beendet ist.

Wie kann ich das erreichen?

os.wait() verstehe ich nicht so recht, aber wenn ich es einbaue, hängt einfach mal alles.

Der Prozess wird von os.popen() erzeugt. Allerdings sollte ich das Modul, das ich verwende nicht editieren.
BlackJack

@ravenheart: Ungünstige Ausgangsbedingungen würde ich mal sagen.
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Hmm durch ein wenig rumspielen hab ich herausgefunden, dass der Prozess an ein Objekt gebunden ist.

Code: Alles auswählen


def my_method():
    g = Plotobject()            ----> Hier ensteht ein Prozess
    g.plot( plotfile )          ----> hier wird in diesen Prozess reingepiped

    os.remove( plotfile)        ----> ich möchte die Datei nach Benutzung löschen, weiß aber nicht wann plot() fertig ist, der Prozess existiert solange g existiert

Das ist der grobe Aufbau.
Gibt es hier eine Möglichkeit das ganze sicher zu beenden und die Datei zu löschen?

Aufmerksam wurde ich auf das Problem, als Beschwerden über unreadable files kamen, die Datei war schon gelöscht, bevor etwas geplottet wurde

Soweit ich das sehen kann ist es ja nichtmal sicher, dass alles nach Plan läuft, selbst wenn ich die Datei nicht löschen möchte,
Was würde passieren, wenn meine Methode zu früh beendet wird?

Um ganz genau zu sein:
Ich verwende das Gnuplot -Modul
Es bietet zwar File-Klassen an, aber da ich komplexe Befehle verwenden möchte, lege ich selbst die temporären Dateien an und bastle
mir einen command-string zusammen, welchen ich plot übergebe.

Diese strings haben dann etwas den Aufbau:
"'/tmp/Vk8jdgh' using 5:15 every :::0::0 title 'A' , '/tmp/Vk8jdgh' using 5:15 every :::1::1 title 'B', ..."
Ich hab noch keine Möglichkeit gesehen so etwas einfacher zu gestalten
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

wie wärs die matplotlib zu verwenden ?
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Kannst du den Prozess nicht mit subprocess erzeugen? Dann könntest du mit

Code: Alles auswählen

p = subprocess.Popen(args)
p.wait()
auf dessen Terminierung warten.
BlackJack

@Rekrul: Das passiert in einer externen Bibliothek die nicht verändert werden soll.
Antworten