显示shell进程输出的Python GUI(glade)

问题描述:

我正在编写一个使用subprocess.Popen对象运行多个子进程的python应用程序。 我有一个glade GUI,想要实时显示gui中这些命令的输出(在subprocess.Popen中运行)。显示shell进程输出的Python GUI(glade)

任何人都可以提出一种方法来做到这一点?我需要使用哪些glade对象以及如何重定向输出?

大量阅读并未获得我想要的结果后,我找到了另一种方法。

它是这样的

#!/usr/bine/env python 
import subprocess 
import gtk 

### Of course, you should have the gui built and know which widgets to use for this. 
viewer = self.builder.get_widget('txtview') 
proc = subprocess.Popen('ls -al /home'.split(), stdout=subprocess.PIPE, stderr = subprocess.STDOUT) 
while True: 
    line = proc.stdout.readline() 
    viewer.get_buffer().instert_at_cursor(line) 
    if not line: 
     break 

格莱德只编译GTK图形用户界面,所以当你问一个空地对象也许你应该问GTK控件在这种情况下textbuffer和TextView的chould是一个解决办法也许TreeView和liststore的程序。 subprocess.Popenstdoutstderr参数可以接受类似文件的对象。您可以创建一个适配器,写入文本缓冲区或在列表存储中添加项目

+0

我纠正了......我的意思是gtk小部件。 现在,关于这个适配器,你能提供更多的细节吗? 你的意思是像一个不断读取stdout和stderr并将其写入gtk小部件的计时器对象吗?或者你有什么不同的想法? – 2009-12-18 16:39:37

+0

我在想Popen将输出写入文件对象,而不是使用.fileno()方法和os.fdopen()到该文件描述符(我不知道为什么)。所以你可以使用.communicate()来读取内存中的所有输出,直到进程退出。 如果这不是您的选择,您可以使用PIPE并不断读取它(可能来自线程)。希望这有助于更多 – 2009-12-18 17:48:18

这里也显示这样做的另一种方式的链接。

我发现这很有洞察力,也许别人可以使用这些提示。

http://pygabriel.wordpress.com/2009/07/27/redirecting-the-stdout-on-a-gtk-textview/

+0

+1:基于'gobject.io_add_watch'的解决方案。 – jfs 2009-12-21 21:15:13