gpt4 book ai didi

python - 如何使用用户提示流式传输子进程输出?

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

这是我的子流程调用:

def myrun(cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout = []
while True:
line = p.stdout.readline()
stdout.append(line)
print line,
if line == '' and p.poll() != None:
break
return ''.join(stdout)

当我正常运行“cmd”时,输出通常是这样的:

一些文本...
一些文字...
你想继续[是/否]吗? : 是的
更多输出...

但如上所示,使用子进程运行相同的“cmd”,我的输出是这样的:

你想继续[是/否]吗? : 是的
一些文字...
一些文字...
更多输出...

我该如何解决这个问题?

最佳答案

这主要是因为无论您的 cmd 程序有什么,通常都会有缓冲。您必须禁用该程序中发生的默认缓冲才能获得您正在寻找的内容。

如果它是一个 python 文件,您正在通过 cmd 运行,如下所示,您可以在 python 命令中添加 "-u" 参数以获得您想要的结果

cmd = ["python", "-u", "/link/to/python/file.py"]
myrun(cmd)

根据 python 的 man 文档,

-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x

对于要在 shell 中运行的任何文件,我会说 stdbuf 命令是您的安全选择。将 -o 选项连同命令一起设置为 0(零),您就可以开始了。

cmd = ["sh", "\path\to\sh\file.sh"]
unbuffered_cmd = ["stdbuf", "-o0", "-e0"] + cmd
myrun(unbuffered_cmd)

请注意stdbuf带有 GNU coreutils。所以它可能与平台无关。

即使存在 stdbuf 并且为 python 设置了 "-u",为了更安全,将 Popen 的 bufsize 参数设置为1

Popen(cmd, stdout=PIPE, stderr=STDOUT, bufsize=1)

如果 stdbuf 也没有帮助,我别无选择:-)

关于python - 如何使用用户提示流式传输子进程输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28535282/

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