以下脚本BrokenPipeError: [Errno 32] Broken pipe
在通过管道传递到类似命令时会引发head
(除非要开头的行数超过 Python 脚本打印的行数)。
for i in range(16386):
print("")
$ python test-pipe.py | head -1
Traceback (most recent call last):
File "test-pipe.py", line 2, in <module>
print("")
BrokenPipeError: [Errno 32] Broken pipe
我的理解(从这个答案和这个问题的答案)是,如果在 Python 进程完成写入之前关闭管道,则会引发错误。
但是,如果我将迭代范围从 1 减少到 16385,则不会引发错误(不确定此阈值在所有机器上是否相同,因此可能只需尝试一个高低数字来重现)。我最初认为这可能与管道缓冲区大小有关,但对我来说是 64K(根据M=0; while printf A; do >&2 printf "\r$((++M)) B"; done | sleep 999
,所以这似乎不是原因。
为什么发生BrokenPipeError
取决于管道的大小?
这适用于 Linux 5.4.15-arch1-1 上的 Python 3.8.1。