【问题标题】:Get realtime output from python subprocess从 python 子进程获取实时输出
【发布时间】:2015-06-08 14:33:03
【问题描述】:

我正在尝试从 Python 调用命令行实用程序。代码如下

import subprocess
import sys

class Executor :

    def executeEXE(self,executable ) :

        CREATE_NO_WINDOW = 0x08000000
        process = subprocess.Popen(executable, stdout=subprocess.PIPE,
                                   creationflags=CREATE_NO_WINDOW )
        while True:
            line = process.stdout.readline()
            if line == '' and process.poll() != None:
                break
            print line

上面代码的问题是我想要上面进程的实时输出,但我没有得到。我在这里做错了什么。

【问题讨论】:

  • subprocess.popen() 输出在this answer 中回显的方式可能会有所帮助。
  • 这里是another couple of articles that won't help you(看来您使用的是 Windows)。至少使用基于iter() 的循环而不是while-循环。
  • @Sebastian 我认为readline() 语句在某种程度上没有返回输出。我不确定iter() 会有什么帮助。是的,我在 Windows 上。

标签: python command-line subprocess


【解决方案1】:

您的代码中有两个问题:

  1. 首先,readline() 将阻塞,直到打印出新行并刷新。
    这意味着你应该执行代码

    当真时:
    ...

在一个新线程中并在输出准备好时调用一个回调函数。

  1. 由于 readline 正在等待换行,所以必须使用

    打印'Hello World'
    sys.stdout.flush()

每次都在您的可执行文件中。

您可以在我的 git 上看到一些代码和示例:
pyCommunicator

相反,如果您的外部工具被缓冲,您唯一可以尝试的就是使用 stderr 作为 PIPE: https://stackoverflow.com/a/11902799/2054758

【讨论】:

  • 感谢您的回答 :) 我理解这个问题,但我找不到解决办法。当我在命令行上运行相同的可执行文件时,我可以看到实时输出。而且我知道它进入换行符。关于第二部分,我已经尝试过,但仍然没有成功。这应该意味着进程正在缓冲输出。另外,如果可能的话,我可以在新进程的标准输入上输入命令并像 shell 一样使用它吗?
  • 是的,只需在您的“可执行”变量中放入一个字符串命令和参数数组
  • 没有。我的意思是像 shell 一样。要在 shell 上执行命令,读取输出并再次执行相同操作。
猜你喜欢
  • 2021-04-15
  • 2021-01-18
  • 1970-01-01
  • 2010-10-22
  • 2015-01-21
  • 2013-08-18
相关资源
最近更新 更多