gpt4 book ai didi

python - 使用 asyncio 子进程时是否可以设置管道的缓冲区大小?

转载 作者:太空狗 更新时间:2023-10-30 01:28:30 25 4
gpt4 key购买 nike

我正在编写一个使用的相当复杂的脚本

asyncio.create_subprocess_exec(sub_cmd, *sub_cmd_args, stdout=PIPE, stderr=PIPE)

包装另一个 Python 程序——我无法永久修改或以其他方式直接包含——以捕获其 stdout/err 以进行日志记录。包装的 Python 脚本未使用 -u(无缓冲)选项,因此包装程序倾向于记录大缓冲 block 。如果这是常规的 subprocess.Popen,我可以传递 bufsize=1 来获得我想要的,即行缓冲。但是,如果我将它添加到 asyncio.create_subprocess_exec() 中,它们会专门捕获它,我会得到:

<snip>
File "/usr/lib64/python3.4/asyncio/subprocess.py", line 193, in create_subprocess_exec
stderr=stderr, **kwds)
File "/usr/lib64/python3.4/asyncio/base_events.py", line 642, in subprocess_exec
raise ValueError("bufsize must be 0")
ValueError: bufsize must be 0

我认为他们的陷阱是有充分理由的,所以我想知道是否有其他方法可以影响传输缓冲。

最佳答案

我首先通过将 -u 添加到包装程序的 shebang 行向自己证明这确实是一个管道缓冲问题。不过,我不能依赖它作为解决方案,因为这样的更改最终会被操作系统更新破坏。

虽然我能够以类似的方式解决问题:

  • 包装程序是管道的父程序,因此它控制着它的子程序的环境。
  • Python 应在其继承环境中遵守 PYTHONUNBUFFERED=1
  • asyncio.create_subprocess_exec() 确实支持 env= 参数以及可以传递给 subprocess.Popen() 的大多数其他内容;可能有点文档不足,但查看代码会发现这一点非常明显。

所以我把电话改成了:

asyncio.create_subprocess_exec(sub_cmd, *sub_cmd_args, stdout=PIPE, stderr=PIPE, env={'PYTHONUNBUFFERED': '1'})

这非常有效,这要归功于我的好 friend 和技术专家。

关于python - 使用 asyncio 子进程时是否可以设置管道的缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148409/

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