python - 使用设置了“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 脚本中的所有版本:I
、II
和都会III
导致退出代码141
,而我希望它们简单地以 . 退出0
。
直觉上,我知道我的 Python 脚本想要exit(0)
在yes
仍在写入 Python 的标准输入时,并且由于 强制执行的行为set -o pipefail
,这会导致141
退出代码。
到目前为止,我发现克服这个问题的唯一解决方案是简单地继续读取标准输入,直到输入用尽,但我想知道我的 Python 脚本是否有其他解决方案来防止退出代码141
发生。
解决方案
{ yes || :; } | ./test.py
或者
./test.py < <(yes)
...将忽略任何退出状态,yes
以反映其无法写入标准输出。
推荐阅读
- reactjs - 如何在反应中通过 onClick 获取卡 ID?
- spring - Spring ConfigurationProperties 未从 application.yml 加载值(默认)
- python - 基于形状的数字相似度
- airflow - 升级到airflow2.0.2后导入错误
- docker - Docker 在哪里存储下载图像的源文件(apache 气流)
- python - How do I multiply a vector with a matrix?
- node.js - 错误:curl 文件时使用 Gunzip 进行的标头检查不正确
- nuxt.js - 在启动时填充 NUXTJS 存储状态内容?
- c# - 触摸:WPF 触摸模态对话框外部导致未处理的第 10 次触摸
- javascript - React-i18n 在渲染翻译之前显示 json 属性标签