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

时间:2019-12-21 14:10:22

标签: 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
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 $?

运行此shell脚本的结果:

141

Python脚本中的所有版本:IIIIII都会导致退出代码141,而我希望它们仅以{{ 1}}。

直觉上我了解到0仍在写入Python的stdin时,我的Python脚本想要exit(0),并且由于yes强制执行的行为,这导致{{1 }}退出代码。

到目前为止,我找到的唯一解决此问题的方法是继续读取标准输入,直到输入用尽,但是我想知道我的Python脚本是否还有其他解决方法可以防止退出代码{{1} }。

1 个答案:

答案 0 :(得分:1)

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

./test.py < <(yes)

...将忽略yes的任何退出状态,反映出它无法写入标准输出。