[Python-de] Zugriff auf stdout und stderr von "externe" Prozessen unter Window

Martin Wisskirchen martin.wisskirchen at fit.fraunhofer.de
Don Mar 23 13:26:21 CET 2006


Stefan Behnel wrote:

>Martin Wisskirchen schrieb:
>  
>
>>ich möchte eine grafische Anwendung (Tkinter) erstellen, die 
>>verschiedene Informationen sammelt und darauf hin den MS Visual Studio 
>>7.1 C++ Compiler  (Terminal) startet. Dieser gibt normalerweise seine 
>>Ausgaben auch anf dem Terminal aus. Diese Ausgaben möchte ich allerdings 
>>in ein Text-Widget umlenken. Dies mache ich bereits mit os.popen3 und 
>>das funktioniert auch soweit. Das Problem ist allerdings, das die 
>>Ausgaben erst von den Fileobjects ausgegeben werden, wenn der Compiler 
>>beendet ist. Um denCompilerungsprozess zu überwachen ist dies allerdings 
>>denkbar schlecht. Dies liegt wahrscheinlich daran, dass der Compuiler 
>>Output seitens des Compiler-Prozesses gebuffert wird.
>>Unter Unix kann man dies scheinbar (?) unter Zuhilfename von "pty" 
>>verhindern, dass steht leider unter Windows nicht zur Verfügung.....
>>
>>Hier der Code:
>>        
>>      
>>       #qmakecall ruft qmake mit den zugehöhrigen Parametern auf....
>>
>>         (input, output, error) = os.popen3(qmakecall)
>>
>>             
>>       #self.debugWindow ist das TextWidget, das übergeben wird.....
>>         self.debugWindow.insert(END, input.read()) 
>>         self.debugWindow.insert(END, error.read())
>>    
>>
>
>Hi,
>
>nur so'n Schnellgriff in's Blaue, hast du mal versucht, ob subprocess sich
>anders verhält?
>
>http://docs.python.org/lib/module-subprocess.html
>
>Ansonsten sehe ich an deinem Source, dass du die beiden read()s nacheinander
>aufrufst. Dadurch erhälst du die zweite Ausgabe natürlich dann auch erst, wenn
>stdout zu Ende gelesen wurde.
>
>Stefan
>
>  
>
Hi ,

erstmal danke für die "Schnellschuss"....

irgendwie funktioniert das auch nicht besser, das immer noch die 
Beendigung des gestarteten Prozessen abgewartet werden muss....
Zumindest laut:

http://wiki.python.de/Neue_Features#Subprocess


wenn man das 'process.wait()' rausnimmt, bekommt man in der Kombination 
mit "process.stdout.readline()" zwar während der Laufzeit des 
Kind-Prozesses Ausgaben, die aber leider unvollständig sind. Angeblich 
ist die Buffergröße per default auf 0 gesetzt und somit sollte alles 
ungebuffert durchgehen.

Bin ein bißchen ratlos...

Gruß

Martin