来自Python子进程的实时输出/流

时间:2019-01-08 11:59:56

标签: python stream console subprocess

我正在使用Python,它是子进程库,用于检查使用strace进行的调用的输出,这是关于以下问题的事情:

subprocess.check_output(["strace", str(processname)]) 

但是,这只会在被调用的子进程完成后给我输出,这对于我的用例来说是非常有限的。

我需要该过程的某种“流”或实时输出,因此我需要在该过程仍在运行而不是仅在完成后读取它。

是否有使用子流程库实现此目的的便捷方法? 我正在考虑每x秒进行一次民意测验,但是在文档中没有发现有关如何实现此目的的任何提示。

非常感谢。

3 个答案:

答案 0 :(得分:2)

从 Python 3.2 开始(当上下文管理器支持添加到 Popen 时),我发现这是从子进程连续流输出的最直接的方法:

import subprocess


def run(args):
  with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as process:
    for line in process.stdout:
      print(line.decode('utf8'))

答案 1 :(得分:1)

根据documentation

Popen.poll()

  

检查子进程是否已终止。设置并返回returncode属性。

因此,您可以:

process = subprocess.Popen('your_command_here',stdout=subprocess.PIPE)
while True:
    output = process.stdout.readline()
    if process.poll() is not None and output == '':
        break
    if output:
        print (output.strip())
retval = process.poll()

这将循环播放,读取标准输出,并实时显示输出。

答案 2 :(得分:1)

在引用selected answer用于测试运行程序的流输出时存在一些问题。以下对我来说更好:

import subprocess
from time import sleep

def stream_process(process):
    go = process.poll() is None
    for line in process.stdout:
        print(line)
    return go

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while stream_process(process):
    sleep(0.1)