【发布时间】:2018-10-07 00:15:14
【问题描述】:
如果有任何失败,我在 python 脚本(使用 python 3.4)中有以下内容:
exit(1)
这个python脚本的目的是给print()一些值,这样它就可以像这样分配给一个shell变量:
#!/bin/bash
set -e
result=$(python my-script.py)
echo $?
但是,如果脚本失败,上面的 echo 返回 0。如果 python 脚本失败(即返回非零退出代码),我希望 set -e 立即中断脚本并使脚本失败。
我怎样才能做到这一点?我也在我的 bash 脚本中尝试了set -eo pipefail,但我发现没有任何区别。
我正在运行 Ubuntu 15。
编辑
我的python脚本(逐字)以防万一它是这里的嫌疑人......
import re
import sys
version_regex = r'(?:(?:release|hotfix)\/|^)([\d.]+)-\d+-g[a-f\d]+$'
result = re.search(version_regex, sys.argv[1])
if not result:
exit(1)
print(result.group(1))
请注意,我在实验中尝试了 sys.exit(1) 和 exit(1),但我从未见过我的 bash 脚本失败。
编辑 2
parsed_version=$(python parse-git-describe.py $describe_result; echo $?)
echo $parsed_version
echo $?
上面的 bash 脚本给了我以下输出:
1
0
注意脚本parse-git-describe.py和之前提供的python脚本是一样的。
编辑 3
显然local 导致此中断。上面的 EDIT 2 是错误的,即在 shell 函数中使用 local 的结果:
foo()
{
local parsed_version=$(python parse-git-describe.py $describe_result; echo $?)
echo $parsed_version
echo $?
}
结果是:
1
0
但如果我删除 local 会正常吗?
foo()
{
parsed_version=$(python parse-git-describe.py $describe_result; echo $?)
echo $parsed_version
echo $?
}
结果是:
1
1
为什么local 很重要?
【问题讨论】:
-
见this SO 帖子。提到
set -e是不可靠和不好的做法。您的脚本不一定能到达echo -
由于您直接使用
exit,请尝试将您的导入更改为from sys import exit。 -
我已经阅读了那篇文章,我知道人们建议
trap,但我不确定如何在我的具体情况下使用它。 -
@ray 我对 python 中的
sys.exit()的理解是它用于“应用程序”,而exit()用于交互式外壳(这是我的情况) -
您的脚本以
local: can only be used in a function结束。