Python打印StdOut收到它

时间:2009-07-20 07:41:19

标签: python stdout

我正在尝试在我正在编写的PyQt GUI应用程序中运行一个简单的(windows)命令行工具。我遇到的问题是命令行工具将它的进度抛出到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的内容,但是当发送进度消息时,我得到它,一旦命令行应用程序退出,它似乎一次冲洗StdOut。

有简单的答案吗?

2 个答案:

答案 0 :(得分:1)

通过stdin / stdout进行交互式通信是一个常见问题。

你很幸运,使用PyQt你可以使用QProcess,如下所述: http://diotavelli.net/PyQtWiki/Capturing_Output_from_a_Process

答案 1 :(得分:0)

我明白这个问题吗? 我相信你正在运行类似“回声第一;睡60;第二回声”的内容,你希望看到“第一个”远远超过“第二个”,但它们都是同时吐出来的。

您遇到问题的原因是操作系统将进程的输出存储在其内存中。如果缓冲区已填满,或者其他程序已结束,则只会将输出发送到程序。所以,我们需要挖掘O / S并弄清楚如何分辨它“嘿,给我这个!”这通常称为异步或非阻塞模式。

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

尝试一下: http://code.activestate.com/recipes/440554/