首页 > 解决方案 > 使用设置了“set -o pipefail”的 Python 脚本从标准输入读取时获取退出代码 141

问题描述

这是我遇到的问题的最小可能示例:

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)

外壳脚本:

set -o pipefail
yes | ./test.py ; echo $?

运行此 shell 脚本的结果:

141

Python 脚本中的所有版本:III和都会III导致退出代码141,而我希望它们简单地以 . 退出0

直觉上,我知道我的 Python 脚本想要exit(0)yes仍在写入 Python 的标准输入时,并且由于 强制执行的行为set -o pipefail,这会导致141退出代码。

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

标签: pythonpipe

解决方案


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

或者

./test.py < <(yes)

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


推荐阅读