[英]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.py
端flush
输出,以确保发射器实际发送了线路(当重定向输出时,不确定)。 示例程序:
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.