当 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 脚本有未处理的异常时退出代码的主要内容,如果未能解决你的问题,请参考以下文章

代码学习PYTHON 异常处理

当 for 循环中不匹配时退出 python 脚本

当其中一个线程中存在未捕获的异常时,Python 多线程程序不会退出

GraphQL java:当请求有未使用的变量时抛出异常

PHP异常处理机制

异常处理