【发布时间】:2022-06-19 06:43:14
【问题描述】:
我正在尝试运行一个打印某些内容的 python 文件,等待 2 秒,然后再次打印。我想从我的 python 脚本中实时捕获这些输出,然后处理它们。我尝试了不同的方法,但没有任何效果。
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
while True:
output = process.stdout.readline()
if process.poll() is not None and output == '':
break
if output:
print(output.strip())
我在这一点上,但它不起作用。它一直等到代码完成,然后打印所有输出。
我只需要运行一个 python 文件并从中获取实时输出,如果您有其他想法,不使用打印功能,请告诉我,只知道我必须单独运行该文件。我只是想到了最简单的方法,但是,据我所见,它无法完成。
【问题讨论】:
-
这能回答你的问题吗? live output from subprocess command
-
我都试过了,还是不行
-
这里有三层缓冲,需要限制三层才能获取实时数据: 1) 使用
stdbuf或者改变程序本身,将程序的缓冲改为line面向模式(或添加fflushs);否则,一切都会卡在子进程的用户模式缓冲区中。 2)将bufsize=1添加到Popen参数(可能不需要,因为您不发送stdin,但无害)。 3) 将flush=True添加到print参数中(如果您连接到终端,行缓冲将为您刷新它,因此只有将标准输出通过管道传输到文件时才有意义)。跨度> -
明确一点,#1 中的
stdbuf是*NIX 世界的解决方案;您只需将Popen更改为运行['stdbuf', '-oL'] + cmd。 -
谢谢@ShadowRanger,问题是打印上的flush=True。
标签: python subprocess stdout