繁体   English   中英

如何使用python实时读取输出过程?

[英]How read in realtime an output process with python?

我需要实现一个Python脚本,该脚本逐行实时读取其他进程的输出。 显然,我曾经尝试使用“子进程”来获取带有stdout的输出进程。 但是我无法实时获得该输出,实际上,每次python脚本在进程启动后几次都会在几个块中返回输出。 例如,我使用以下python脚本:

import subprocess as sub
import sys

proc = sub.Popen(["python", "bin/read_test.py"], 
                 stdout = sub.PIPE, 
                 bufsize = 1)

while True:
        if proc.poll() is None:
                line = proc.stdout.read()
                line = line.decode("utf-8")
                print(line, flush = True)
                sys.stdout.flush()
        else:
                proc.stdout.close()
                break

要读取的read_test.py脚本:

from time import sleep

for i in range(5):
        print(i)
        sleep(1)

我已经尝试了很多带有for循环的“ readline()”方法,但是问题仍然相同。

而且,我不想使用“通讯”,因为它是一种阻止方法。

谢谢你的帮助,

问题是您正在尝试完全阅读stdout

由于python看到进程仍在运行,因此它一直等到进程结束,以便进程输出完成。

要执行您想要的操作,您可能想使用line = proc.stdout.readline()读取输出

您可能必须更改循环以读取行,并在过程结束时停止

proc = sub.Popen(["python", "bin/read_test.py"],
                 stdout = sub.PIPE,
                 bufsize = 1)

while True:
    line = proc.stdout.readline()
    if line:
        line = line.decode("utf-8")
        print(line)
        sys.stdout.flush()
    if proc.poll() is not None:  # process ends
        break

proc.wait()

但这还不够:您必须在read_test.pyflush输出,以确保发射器实际发送了线路(当重定向输出时,不确定)。 示例程序:

import time,sys

for i in range(5):
    print(i)
    sys.stdout.flush()  # not flushing: you get all the lines at the end of the process
    time.sleep(1)

我已经连接了两个程序,并且每秒得到1个顺序输出(1,2,3,4,5)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM