Zugriff auf stdout und stderr von "externe" Prozessen unter Window
Hallo zusammen, 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()) _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Martin Wisskirchen schrieb:
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.
Das kommt IMHO auch darauf an, wie der andere Prozess nach stdout schreibt... Stichwort stdout.flush() Vielleicht hilft dir die beiden Threads weiter: http://www.python-forum.de/viewtopic.php?t=4941 http://www.python-forum.de/viewtopic.php?t=2875 -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Martin Wisskirchen schrieb:
(input, output, error) = os.popen3(qmakecall)
Schau mal hier: http://wiki.python.de/Neue_Features#Subprocess -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Martin Wisskirchen schrieb:
Das Problem ist allerdings, das die Ausgaben erst von den Fileobjects ausgegeben werden, wenn der Compiler beendet ist.
Hi Martin! Vielleicht kannst du damit etwas anfangen (ungetestet): http://pexpect.sourceforge.net/ mfg Gerold :-) -- ________________________________________________________________________ Gerold Penz - bcom - Programmierung gerold.penz@tirol.utanet.at | http://gerold.bcom.at | http://sw3.at Ehrliche, herzliche Begeisterung ist einer der wirksamsten Erfolgsfaktoren. Dale Carnegie _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Gerold Penz schrieb:
Vielleicht kannst du damit etwas anfangen (ungetestet): http://pexpect.sourceforge.net/
Hi Martin! Sorry, ich sehe gerade, dass pexpect auch auf PTY aufbaut und es deshalb nicht mit Windows funktioniert. mfg Gerold :-) -- ________________________________________________________________________ Gerold Penz - bcom - Programmierung gerold.penz@tirol.utanet.at | http://gerold.bcom.at | http://sw3.at Ehrliche, herzliche Begeisterung ist einer der wirksamsten Erfolgsfaktoren. Dale Carnegie _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (4)
-
Gerold Penz
-
jens
-
Martin Wisskirchen
-
Stefan Behnel