Python脚本未处理异常时的退出码

12 投票
2 回答
21978 浏览
提问于 2025-04-16 14:33

我需要一种方法来运行一个Python脚本文件,如果这个脚本因为没有处理的错误而失败,Python应该以一个非零的退出代码结束。我的第一次尝试是这样的:

import sys
if __name__ == '__main__':
    try:
        import <unknown script>
    except:
        sys.exit(-1)

但是这样会导致很多脚本出问题,因为很多脚本都使用了__main__这个保护机制。有没有什么好的建议可以正确地做到这一点呢?

2 个回答

3

如果你想在一个脚本里运行另一个脚本,直接用import是不行的;如果你只关心捕捉错误,可以用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。

19

Python已经能做到你想要的事情:

$ python -c "raise RuntimeError()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError
$ echo $?
1

在原作者做了一些修改后,也许你想要的是:

import subprocess

proc = subprocess.Popen(['/usr/bin/python', 'script-name'])
proc.communicate()
if proc.returncode != 0:
    # Run failure code
else:
    # Run happy code.

如果我理解错了,请纠正我。

撰写回答