使用带有“0”的Python脚本从stdin读取时获取退出代码141;设置-o pipefail“;设置
这是我遇到的问题的一个最小可能的例子: Python脚本:使用带有“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
#!/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脚本方面采取任何措施来防止这种情况发生?