[pygtk] Non-blocking subprocess.Popen stop GUI
John Finlay
finlay at moeraki.com
Tue Sep 1 03:40:16 WST 2009
Bou Baris wrote:
>> Instead of using select() use gobject.io_add_watch() on proc.stdout to
>> register a callback function that is used to read the % and set the progress
>> bar.
>>
>
> I've modified my code to test gobject.io_add_watch()
> I expect that test_io_watch() print in console line readed from proc.stdout
> But i see nothing: look like a blocking behaviour (as when use Popen
> without use select)
> If I stop program with CTRL-C, now I see the output to console/terminal
>
>
> def test_io_watch(self, file, condition):
> print str(file.readline())
> return True
>
> def mkv_dts_extraction(self,dtstrack,pgbar=None):
>
> command=['mkvextract', \
> 'tracks', \
> self.INPUTFILE, \
> dtstrack + ':' + self.TEMP_DTSFILENAME]
>
> proc=subprocess.Popen(command,stdout=subprocess.PIPE)
>
> outfile=proc.stdout
> outfd=outfile.fileno()
> file_flags = fcntl.fcntl(outfd, fcntl.F_GETFL)
> fcntl.fcntl(outfd, fcntl.F_SETFL, file_flags | os.O_NDELAY)
>
> gobject.io_add_watch(proc.stdout,gobject.IO_IN |
> gobject.IO_HUP,self.test_io_watch)
>
> err = proc.wait()
>
> return True
> _______________________________________________
>
Also I forgot you must use file.read() instead of file.readline() in
your callback since you need to read all the available input in the
callback.
John
More information about the pygtk
mailing list