stdout sofort ausgeben

08/04/2010 - 16:45 von Florian Lindner | Report spam
Hallo,

ich rufe ein externes Programm so auf:

popen = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
com_ret = popen.communicate()
sh_ret = ShellReturn(com_ret[0])
sh_ret.stderr = com_ret[1]
sh_ret.ret_code = popen.returncode

Das klappt soweit ganz gut, bis auf die Sache, dass ich stdout des
aufgerufenen Programms auch gerne sofort ausgeben möchte.
Ist z.B. cmd="echo 'a' && sleep 2 && echo 'b'" so hàlt das Skript 4
Sekunden an und ich kann dann mit print sh_ret das Ergebnis ausgeben.
Ich würde allerdings gerne sofort ausgeben, sobald es nach stdout
geschrieben wird (die Ausgabe trotzdem aber auch in einer Variable
speichern).
Übergebe ich stdout=subprocess.STDOUT àndert sich leider nichts im
Verhalten.

Danke,

Florian
 

Lesen sie die antworten

#1 Christopher Arndt
08/04/2010 - 17:05 | Warnen spam
Florian Lindner schrieb:
ich rufe ein externes Programm so auf: [...]
Das klappt soweit ganz gut, bis auf die Sache, dass ich stdout des
aufgerufenen Programms auch gerne sofort ausgeben möchte.[...]
(die Ausgabe trotzdem aber auch in einer Variable speichern).



Schau dir mal die Implementierung von subprocess.Popen.communicate() an.
Das benutzt zwei Therads um stdout und stderr zu lesen. In diesen
Threads könntest du die Ausgaben der Subprozesse auch gleich an stdout
des Hauptprozesses schicken.

Ich habe sowas àhnliches zufàllig vor einigen Wochen gemacht, nur werden
hier die Ausgaben der Subprozesse mit dem logging Modul geloggt:

http://paste.chrisarndt.de/paste/a6...824d4f88ab

Ich benutze das, um Prozesse, die lange laufen, zu überwachen und ggf.
abzubrechen.

Chris

Ähnliche fragen