我想编写一个运行多个程序的简单应用程序,并在多个终端(样式)窗口中显示它们的输出。另外,我希望能够读取这些进程的stdout / stderr并在输出中搜索关键字。
我尝试在python中实现这两种方式,第一种使用subprocess.Popen,第二种使用vte(python-vte)。
我只是让Popen与民意调查一起工作。我必须不断检查进程是否有要读取的数据,读取数据,然后将其发送到我的TextArea。建议使用gobject.io_add_watch()代替,但每当我尝试我的程序挂起第二次调用io_add_watch时 - 它就像它一次只能处理一个文件描述符。
vte工作得很好,但我没有找到一种可靠的方法来捕获输出。您可以在光标移动时获得回调,然后屏幕刮擦w / get_text(),但我已经遇到过这样的情况,我正在查看这些程序一次性产生一个关于tty的淫秽然后它就在屏幕外。似乎没有包含要添加到窗口的新文本的回调。
有什么想法吗?
答案 0 :(得分:1)
我使用subprocess.Popen做了类似的事情。对于每个进程,我实际上最终将stdout和stderr重定向到临时文件,然后定期检查文件以获取更新并将输出转储到TextView。
不使用管道进程的原因是进程本身易变,容易出现段错误。当发生这种情况时,我有时会在最后一次读取和段错误之间丢失数据(这是确定段错误原因最需要的数据)。
事实证明,有时候我想保存特定进程的输出,所以这种方法对我来说效果很好。
答案 1 :(得分:1)
如果你接受igkuk的建议,我在相关问题中得到了some good advice on watching files for changes。这对我来说非常好(我正在观看日志文件的更改)。
答案 2 :(得分:0)
您希望使用select来监控子流程中的管道。这比投票更好。