【问题标题】:Python Printing StdOut As It ReceivedPython 在收到时打印 StdOut
【发布时间】:2009-07-20 07:41:19
【问题描述】:

我正在尝试在我正在编写的 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 时获得它。

有简单的答案吗?

【问题讨论】:

标签: python stdout


【解决方案1】:

通过标准输入/标准输出进行交互通信是一个常见问题。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-31
      • 2016-04-03
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2013-05-01
      相关资源
      最近更新 更多