[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