我使用以下调用来生成进程,获取其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标志似乎没有任何区别。有任何想法吗?感谢。
答案 0 :(得分:0)
我想我可能会问错了问题;我将以不同的标题提交。
我所发现的是,孩子的stdout上的手表仅在父母的管道已经填满时才在父母中触发;换句话说,看起来孩子(“sed”进程)在管道填满之前实际上并没有收到任何输入。当我将管道大小设置为4096并将管道预填充到具有4096字节的子管道时,我可以发送512字节块,并且我的父进程'io_add_watch回调(最多读取512字节)将在每次发送新块时调用给孩子。