gpt4 book ai didi

python - 从 subprocess.communicate() 读取流输入

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:14 24 4
gpt4 key购买 nike

我正在使用 Python 的 subprocess.communicate() 从运行大约一分钟的进程中读取标准输出。

如何以流方式打印该进程的 stdout 的每一行,以便我可以看到生成的输出,但在继续之前仍然阻止进程终止?

subprocess.communicate() 似乎一次性给出了所有输出。

最佳答案

一旦子进程刷新其标准输出缓冲区,就逐行获取子进程的输出:

#!/usr/bin/env python2
from subprocess import Popen, PIPE

p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)
with p.stdout:
for line in iter(p.stdout.readline, b''):
print line,
p.wait() # wait for the subprocess to exit

iter() 用于在写入行后立即读取行以解决方法 the read-ahead bug in Python 2 .

如果子进程的标准输出在非交互模式下使用 block 缓冲而不是行缓冲(这会导致输出延迟,直到子进程的缓冲区已满或由子进程显式刷新),那么您可以尝试使用 pexpect, pty modules 强制无缓冲输出或unbuffer, stdbuf, script utilities ,参见Q: Why not just use a pipe (popen())?

<小时/>

这是 Python 3 代码:

#!/usr/bin/env python3
from subprocess import Popen, PIPE

with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')

注意:与 Python 2 不同,Python 2 按原样输出子进程的字节串; Python 3 使用文本模式(cmd 的输出使用 locale.getpreferredencoding(False) 编码进行解码)。

关于python - 从 subprocess.communicate() 读取流输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com