如何刷新pygtk / gnome的gobject.spawn_async返回的文件描述符

时间:2013-07-24 17:02:23

标签: asynchronous pygtk gobject

我使用以下调用来生成进程,获取其stdin,stdout和stderr的文件描述符,并监视其stdout上的输出:

[widget.pid,widget.stdin,widget.stdout,widget.stderr] = \
            gobject.spawn_async(['/bin/sed','s/hi/by/g'], 
                                standard_input=True,
                                standard_output=True,
                                standard_error=True
                                )
 gobject.io_add_watch(widget.stdout,
                      gobject.IO_IN,
                      getdata)

然后我将行写入widget.stdin,期望触发回调函数getdata。

我发现只有在关闭widget.stdin时才会调用回调getdata。

另一方面,从终端,sed回应发送到stdin的每条完成的行,所以我希望sed在它的stdin看到一条完成的行时生成输出,并且它只是没有得到一行一次。

我不清楚如何强制写入widget.stdin的行在/ bin / sed中看到,同时保持连接打开以发送更多行。 python -u标志似乎没有任何区别。有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

我想我可能会问错了问题;我将以不同的标题提交。

我所发现的是,孩子的stdout上的手表仅在父母的管道已经填满时才在父母中触发;换句话说,看起来孩子(“sed”进程)在管道填满之前实际上并没有收到任何输入。当我将管道大小设置为4096并将管道预填充到具有4096字节的子管道时,我可以发送512字节块,并且我的父进程'io_add_watch回调(最多读取512字节)将在每次发送新块时调用给孩子。