def main(): parser = OptionParser(usage="usage: %prog command") (options, args) = parser.parse_args() if len(args) != 1: parser.print_help() sys.exit(1) win = Gtk.Window() textview = Gtk.TextView() textview.modify_font(Pango.FontDescription("Monospace")) textview.show() sw = Gtk.ScrolledWindow() sw.add(textview) sw.show() win.add(sw) win.set_default_size(Gdk.Screen.width() * 2 / 3, Gdk.Screen.height() * 2 / 3) win.show() ## launch process proc = subprocess.Popen(args[0], shell=True, stdout=subprocess.PIPE, bufsize=1, close_fds=True) win.set_title("%s (running)" % args[0]) # print proc.stdout, type(proc.stdout), dir(proc.stdout) chan = GObject.IOChannel(filedes=proc.stdout.fileno()) chan.set_flags(GObject.IO_FLAG_NONBLOCK) sink = tasklet.run(process_stdout_sink(chan, textview.get_buffer(), textview)) ## child watch yield (tasklet.WaitForProcess(proc.pid), tasklet.WaitForSignal(win, "destroy")) if isinstance(tasklet.get_event(), tasklet.WaitForSignal): killproc(proc.pid) Gtk.main_quit() else: ## stop reader yield tasklet.Message("quit", dest=sink) win.set_title("%s (completed)" % args[0]) yield tasklet.WaitForSignal(win, "destroy") tasklet.get_event() Gtk.main_quit()