reading lines from non-terminating subprocess; threading, gtk

jfcg jfcgauss at gmail.com
Tue Feb 22 16:34:49 CET 2011


Greetings,
I am using Python 2.6 on Ubuntu. I have a problem with simultaneously
reading lines from stdout of a subprocess.

listargs.c:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char ** argv) {
	int i;
	// while (1)
	for (i=0; i<argc; i++) {
		puts (argv[i]);
		fflush (stdout);
		sleep(1);
	}
}
This is a (sample) non-terminating process with occasional continous
standard output; could have been a file scanner, etc.
./listargs 1 2 3
./listargs qwe 123 qwr qwt | grep --line-buffered qw
works as expected.

This is my python program. The whole output of the subprocess is
displayed all at once, after the sum of all delays; I want to have
real-time output like above. You can run it with an argument as well
to use the terminal as output. I have tried bufsize=-1,0,1,999 and
shell=True,False but none worked.
subproc.py:
from subprocess import Popen, PIPE, STDOUT
from threading import Thread
import gtk
import sys

class MyThr (Thread):
	def __init__ (self, tb):
		Thread.__init__ (self)
		self.tb = tb
		self.sp = None

	def run (self):
		self.sp = Popen(['./listargs', 'a', 'bc', '1234'], bufsize=-1,
stdout=PIPE)
		for l in self.sp.stdout:
			if len(sys.argv)>1:
				print 'O', l, # this shows that I do get line-by-line output, just
not real-time
				sys.stdout.flush()
			else:
				# self.tb.get_buffer().insert_at_cursor (l)
				self.tb.get_buffer().set_text (l)
				self.tb.show()
				gtk.main_iteration (False)

if len(sys.argv)>1:
	t = MyThr (None)
	t.start()
else:
	dlg = gtk.Dialog ('Dummy Dialog', buttons=(gtk.STOCK_CLOSE,
gtk.RESPONSE_CLOSE))
	dlg.vbox.pack_start (gtk.Label ('Dummy Dialog running..'), False,
False, 4)
	tb = gtk.TextView()
	tb.set_editable (False)
	dlg.vbox.pack_start (tb)
	dlg.set_default_size (400, 250)
	dlg.show_all()
	t = MyThr (tb)
	t.start()
	dlg.run()

t.join()



More information about the Python-list mailing list