2

我正在尝试在我正在编写的 PyQt GUI 应用程序中运行包装一个简单的(Windows)命令行工具。我遇到的问题是命令行工具将它的进度抛出到标准输出(这是一个服务器重置命令,所以你得到“尝试停止”和“重新启动”类型的输出。

我想要做的是捕获输出,以便我可以将其显示为我的应用程序的一部分。我认为执行以下操作会非常简单:

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。

有简单的答案吗?

4

2 回答 2

1

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

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

于 2009-07-20T07:47:39.057 回答
0

我明白这个问题吗?我相信您正在运行类似“echo first; sleep 60; echo second”之类的东西,并且您希望看到“第一个”远远领先于“第二个”,但它们同时吐出。

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

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

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

于 2009-07-29T05:07:16.817 回答