Python 实时打印标准输出

2 投票
2 回答
1197 浏览
提问于 2025-04-15 13:01

我正在尝试把一个简单的(Windows)命令行工具放到我正在写的PyQt图形界面应用程序里。我的问题是,这个命令行工具会把进度信息输出到标准输出(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

这个方法部分有效,我确实能获取到标准输出的内容,但问题是,我并不是实时看到这些进度信息,而是等命令行应用程序结束后,才一次性看到所有的输出。

有没有简单的解决办法呢?

2 个回答

0

我理解这个问题吗?我觉得你在运行类似“echo first; sleep 60; echo second”的命令,你希望“first”能比“second”早显示出来,但它们却是同时输出的。

你遇到问题的原因是,操作系统会把进程的输出存储在内存中。只有当缓存满了,或者其他程序结束时,操作系统才会把输出发送给你的程序。所以,我们需要深入了解操作系统,找出怎么告诉它“嘿,给我这个!”这通常被称为异步或非阻塞模式。

幸运的是,有人已经为我们做了这项艰苦的工作。这个人给Python内置的Popen类添加了send()和recv()方法。看起来他还修复了评论中提到的错误。

你可以试试这个: http://code.activestate.com/recipes/440554/

1

通过标准输入和输出进行互动通信是一个常见的问题。

不过你运气不错,使用PyQt的话可以用QProcess来解决这个问题,具体的介绍可以在这里找到: http://diotavelli.net/PyQtWiki/Capturing_Output_from_a_Process

撰写回答