2009-07-20 47 views
2

我想运行包装一个简单的(Windows)命令行工具在我写的PyQt GUI应用程序。我遇到的问题是命令行工具会将它的进度输出到标准输出(这是一个服务器重置命令,因此您可以获得“正在尝试停止”和“重新启动”输出的输出。Python打印StdOut,因为它收到

我想要做的是捕获输出这样我就可以显示它作为我的应用程序的一部分,我认为这将是非常简单的事情像下面这样:

import os 
import subprocess as sub 
cmd = "COMMAND LINE APP NAME -ARGS" 
proc = sub.Popen(cmd, shell=True, stdout=sub.PIPE).stdout 
while 1: 
    line = proc.readline() 
    if not line: 
     break 
print line 

这在部分工作我得到标准输出的内容,而是作为进度消息发送一旦命令行应用程序退出,我得到它并似乎一次冲洗StdOut。

是它e一个简单的答案?

+0

重复:http://stackoverflow.com/questions/527197/intercepting-stdout-of-a-subprocess-while-it-is-running – 2009-07-20 10:00:12

回答

0

难道我理解这个问题? 我相信你正在运行诸如“先回声,睡60声,回声秒声”,并且希望看到“第一”优先于“第二声”,但它们都在同时吐出。

您遇到问题的原因是操作系统将进程的输出存储在其内存中。如果缓冲区已满,或者其他程序已结束,它只会将输出发送到程序。所以,我们需要深入了解操作系统并找出如何告诉它“嘿,给我这个!”这通常称为异步或非阻塞模式。

幸运的是,有人为我们做了艰苦的工作。 这个人为python内置的Popen类添加了send()和recv()方法。 这看起来像他修复了人们在评论中发现的错误。

试试看: http://code.activestate.com/recipes/440554/