簡體   English   中英

來自 Python 子進程的實時輸出/流

[英]Live-output / stream from Python subprocess

我正在使用 Python 和它的子進程庫來檢查使用 strace 調用的輸出,事情是這樣的:

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

但是,這僅被調用的子進程完成后才給我輸出,這對我的用例來說非常有限。

我需要一種來自進程的“流”或實時輸出,所以我需要在進程仍在運行讀取輸出,不是在它完成后才讀取。

是否有使用子進程庫實現此目的的便捷方法? 我正在考慮每 x 秒進行一次輪詢,但沒有找到有關如何在文檔中實現這一點的任何提示。

提前謝謝了。

根據文檔

Popen.poll()

檢查子進程是否已終止。 設置並返回返回碼屬性。

因此,基於此,您可以:

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()

這將循環,讀取標准輸出,並實時顯示輸出。


這在當前版本的 python 中不起作用。 (至少)對於 Python 3.8.5 及更高版本,您應該將output == ''替換為output == b''

引用所選答案以從測試運行器流式輸出時遇到一些問題。 以下對我來說效果更好:

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)

從 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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM