在Python中使用PyGTK运行多个进程并捕获输出
我想写一个简单的应用程序,它可以同时运行多个程序,并在多个终端窗口中显示它们的输出。此外,我还希望能够读取这些程序的标准输出和错误输出,并在输出中搜索关键词。
我尝试用Python实现这个功能,有两种方法:第一种是使用subprocess.Popen,第二种是使用vte(python-vte)。
我只成功让Popen工作,但需要不断地检查这些进程是否有数据可以读取。我得读取数据,然后把它发送到我的文本区域。有人建议我使用gobject.io_add_watch(),但每次我尝试时,程序在第二次调用io_add_watch时就卡住了——就好像它一次只能处理一个文件描述符。
vte的表现很好,但我还没找到一个可靠的方法来捕获输出。你可以在光标移动时得到一个回调,然后用get_text()来抓取屏幕上的内容,但我已经遇到过一些情况,这些程序一次生成了大量的tty输出,然后就超出屏幕了。似乎没有一个回调可以包含要添加到窗口的新文本。
有什么想法吗?
3 个回答
你想用 select 来监控你子进程的管道。这比不停地轮询要好。
我做过类似的事情,使用了 subprocess.Popen 这个工具。对于每个进程,我实际上是把标准输出和错误输出都重定向到一个临时文件里,然后定期检查这个文件,看有没有更新,把输出内容放到一个 TextView 里。
我之所以不直接用管道连接进程,是因为这些进程不太稳定,容易出现崩溃的情况。当崩溃发生时,我有时候会丢失在最后一次读取和崩溃之间的数据(而这些数据通常是我最需要的,用来判断崩溃的原因)。
结果是,有时候我想保存某个特定进程的输出,所以这个方法对我来说效果很好。
如果你采纳了igkuk的建议,我在一个相关的问题中得到了关于如何监控文件变化的一些好建议。这个方法对我来说效果不错(我是在监控一个日志文件的变化)。