[Python-de] subprocess mit callback

Florian Lindner mailinglists at xgm.de
Do Jun 30 17:45:04 CEST 2011


Am Mittwoch 29 Juni 2011, 21:40:40 schrieb Ulf Rompe:
> Am 28.06.2011 16:25, schrieb Florian Lindner:
> > Siehst Du eigentlich eine Möglichkeit, wie man den Code so formulieren
> > kann, dass ich anstelle des Thread() Objektes ein Popen() Objekt
> > zurückgeben kann?
> 
> Ich bin zwar nicht gefragt, antworte aber einfach trotzdem:

Gut, dass Du Dich auch angesprochen fühlt, ich antworte ja der Liste und 
weniger den Personen. ;-)

Ich habe jetzt zwei Möglichkeiten mein Problem zu lösen. Erstmal kurz zu 
meinem Problem.

Ich schreibe eine Job/Queue-Kontrolle für recht lang laufende Jobs (numerische 
Berechnungen). Eine Job-Klasse soll über ihren Status (finished, running, 
waiting, evtl. failed) Auskunft geben. Zu dieser Statusinformation kann ich 
nun auf zwei Arten gelangen:

- Ich nehme das Popen-Objekt und schaue, was mir poll() zurückgibt (Methode 
nach Ulf)
- Ich benutze callbacks und setzte da meinen Status entsprechend. (Methode 
nach Hans-Peter)

Nun frage ich mich natürlich, was die Methoden für Vor- und Nachteile haben.

Mit poll() ist meine Klasse an sich erstmal zustandslos, es kann also auch 
nichts schiefgehen beim Setzen des Zustandes.

Mit dem Callbacks wiederum habe ich die Möglichkeit noch Aktionen beim 
Abschluss des Jobs auszulösen (z.B. Mail verschicken).

Was ist Eure Meinung dazu?

Es darf - nein soll! - jeder antworten! :-D

Grüße,

Florian

> def popen_callback(on_exit, *popen_args, **popen_kwargs):
>       def threaded_run(on_exit, process):
>           process.wait()
>           on_exit()
>       print popen_args, popen_kwargs
>       proc = subprocess.Popen(*popen_args, **popen_kwargs)
>       thread = threading.Thread(target=threaded_run, args=(on_exit, proc))
>       thread.start()
>       return proc
> 
> 
> Anstelle des ganzen Popen-Objektes könnte man auch lediglich die
> wait()-Methode an threaded_run() übergeben und so aufrufen wie on_exit
> auch. Damit würde man die Funktion vielleicht etwas allgemeiner halten.



Mehr Informationen über die Mailingliste python-de