当 python 脚本有未处理的异常时退出代码
Posted
技术标签:
【中文标题】当 python 脚本有未处理的异常时退出代码【英文标题】:Exit code when python script has unhandled exception 【发布时间】:2011-03-28 08:03:01 【问题描述】:我需要一种方法来运行 python 脚本文件,如果脚本因未处理的异常而失败,python 应该以非零退出代码退出。我的第一次尝试是这样的:
import sys
if __name__ == '__main__':
try:
import <unknown script>
except:
sys.exit(-1)
但由于经常使用__main__
守卫,它会破坏很多脚本。有关如何正确执行此操作的任何建议?
【问题讨论】:
您要运行脚本还是导入模块?如果你想运行脚本,你可以使用subprocess
模块。
我收到一个未知脚本。如果它崩溃,我想运行它并获得一个非零退出代码。 subprocess 并没有太大帮助,因为即使脚本抛出未处理的异常,python 进程也会愉快地返回 0。
【参考方案1】:
Python 已经满足您的要求:
$ python -c "raise RuntimeError()"
Traceback (most recent call last):
File "<string>", line 1, in <module>
RuntimeError
$ echo $?
1
在 OP 进行一些编辑后,也许你想要:
import subprocess
proc = subprocess.Popen(['/usr/bin/python', 'script-name'])
proc.communicate()
if proc.returncode != 0:
# Run failure code
else:
# Run happy code.
如果我在这里感到困惑,请纠正我。
【讨论】:
然后我的 python 或 shell 严重损坏了某些东西,因为无论我做什么,我的 python 都坚持以 0 失败。我会看看我是否可以追踪发生了什么。感谢您对预期行为的清晰解释。我发现的任何地方都没有记录 Python 退出代码! 我看了看,也找不到任何记录退出代码的地方。查看有关您的设置的更多信息(Python 版本、操作系统、触发您认为应该有非零代码的 0 返回代码的脚本)以查看我们是否可以重现可能会很有用。 Ubuntu 10.10,不过升级了几次,手工编译安装了python 2.6.0。甚至像 foo=0/0 这样的东西也触发了这个问题。最后,解决方案就像扔掉旧的 python 安装并将其替换为标准的 Ubuntu 包一样简单。感谢您的帮助!【参考方案2】:如果您想在脚本中运行脚本,那么导入不是办法;如果您只关心捕获异常,则可以使用 exec:
namespace =
f = open("script.py", "r")
code = f.read()
try:
exec code in namespace
except Exception:
print "bad code"
你也可以先编译代码
compile(code,'<string>','exec')
如果您打算多次执行脚本并在命名空间中执行结果
如果您需要获取脚本生成的输出,或者如上所述使用 subprocess。
【讨论】:
以上是关于当 python 脚本有未处理的异常时退出代码的主要内容,如果未能解决你的问题,请参考以下文章