使用带有“0”的Python脚本从stdin读取时获取退出代码141;设置-o pipefail“;设置

使用带有“0”的Python脚本从stdin读取时获取退出代码141;设置-o pipefail“;设置,python,pipe,Python,Pipe,这是我遇到的问题的一个最小可能的例子: Python脚本: #!/usr/bin/env python3 import sys import os import fileinput # I line = sys.stdin.readline() while line: exit(0) line = sys.stdin.readline() # II for line in fileinput.input(): exit(0) pass # III stdi

这是我遇到的问题的一个最小可能的例子:

Python脚本:

#!/usr/bin/env python3

import sys
import os
import fileinput

# I
line = sys.stdin.readline()
while line:
    exit(0)
    line = sys.stdin.readline()

# II
for line in fileinput.input():
    exit(0)
    pass

# III
stdin_input_iter = enumerate(sys.stdin)
try:
    next(stdin_input_iter)
    exit(0)
except StopIteration:
    exit(0)
Shell脚本:

set -o pipefail
yes | ./test.py ; echo $?
141
运行此shell脚本的结果:

set -o pipefail
yes | ./test.py ; echo $?
141
Python脚本中的所有版本:
I
II
III
都会导致退出代码
141
,而我希望它们只需退出
0

直观地说,我知道我的Python脚本想要退出(0),而
yes
仍在写入Python的stdin,并且由于
set-o pipefail
强制的行为,这导致退出代码

到目前为止,我发现克服这个问题的唯一解决方案是继续读取stdin,直到输入用尽为止,但我想知道我的Python脚本是否还有其他解决方案来防止退出代码
141
发生

{ yes || :; } | ./test.py


/test.py<有关为什么会发生这种情况的解释,请参阅密切相关的问题。我没有随身携带笔记本电脑(大约两个小时),因此我无法立即为这个变体编写一个重点版本,但希望在阅读链接后这是显而易见的。谢谢你的回答。这是否意味着我不能在Python脚本方面采取任何措施来防止这种情况发生?