Python 实时打印标准输出
我正在尝试把一个简单的(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()方法。看起来他还修复了评论中提到的错误。
1
通过标准输入和输出进行互动通信是一个常见的问题。
不过你运气不错,使用PyQt的话可以用QProcess来解决这个问题,具体的介绍可以在这里找到: http://diotavelli.net/PyQtWiki/Capturing_Output_from_a_Process