gpt4 book ai didi

python - 子进程标准输入缓冲区不在 bufsize=1 的换行符上刷新

转载 作者:太空狗 更新时间:2023-10-30 03:00:53 26 4
gpt4 key购买 nike

我有两个小的 python 文件,第一个使用 input 读取一行然后打印另一行

a = input()
print('complete')

第二次尝试将其作为子进程运行

import subprocess

proc = subprocess.Popen('./simp.py',
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
bufsize=1)
print('writing')
proc.stdin.write(b'hey\n')
print('reading')
proc.stdout.readline()

上面的脚本将打印“writing”然后“reading”然后挂起。起初我以为这是一个标准输出缓冲问题,所以我将 bufsize=1 更改为 bufsize=0,这确实解决了问题。但是,似乎是标准输入导致了问题。

bufsize=1 的情况下,如果我在写入下方添加 proc.stdin.flush(),该过程将继续。这两种方法看起来都很笨拙,因为 (1) 无缓冲流很慢 (2) 在任何地方添加刷新很容易出错。为什么上面的 write 不刷新换行符?文档说 bufsize 在为子进程创建 stdin、stdout 和 stderr 流时使用,那么是什么导致写入不刷新换行符?

最佳答案

来自 the docs : “1 表示行缓冲(仅在 universal_newlines=True 时可用,即在文本模式下)”。这有效:

import subprocess

proc = subprocess.Popen('./simp.py',
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
bufsize=1,
universal_newlines=True)

print('writing')
proc.stdin.write('hey\n')
print('reading')
proc.stdout.readline()

关于python - 子进程标准输入缓冲区不在 bufsize=1 的换行符上刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27571305/

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