Python 的默认退出代码是啥?

Posted

技术标签:

【中文标题】Python 的默认退出代码是啥?【英文标题】:What is Python's default exit code?Python 的默认退出代码是什么? 【发布时间】:2016-03-21 16:24:10 【问题描述】:

假设您的脚本由于任何类型的失败(异常、语法错误)而没有退出,并且由于sys.exit()os._exit() 而脚本没有退出,那么 Python 如何确定要退出的退出代码?

它似乎是 0,这是有道理的,因为它表示 *nix 系统上没有错误。但是,是否总是以 0 退出(上述情况除外)?令人惊讶的是,经过相当多的在线搜索,我找不到任何明确表示它将以 0 退出的内容,除非另有说明。

【问题讨论】:

【参考方案1】:

sys.exit documents a default exit status of 0os._exit's docs specify a UNIX-like OS constant for "normal" exit status, os.EX_OK,但我一般无法找到退出状态的书面保证。

除此之外,我能给你的最好的就是在 CPython 中,python 可执行文件(包括 Windows 上的 python.exe/pythonw.exe)通过调用 Py_Main 并返回任何内容在 python.c 中实现返回;根据Py_Main 上的书面保证,退出状态为:

0 如果解释器正常退出(即没有异常),1 如果解释器由于异常退出,或者2 如果参数列表不代表有效的 Python 命令行。

请注意,如果引发了其他未处理的SystemExit,只要未设置Py_InspectFlag,此函数将不会返回1,而是退出进程。

因此这意味着在没有活动异常的情况下简单地运行 __main__ 模块的末尾应该始终为 CPython 返回 0,尽管在技术上需要替代解释器来做同样的事情。

此曲目与the implied exit status rules expected of most applications;虽然没有明确说明 Python 必须遵循这些规则,但对于在命令行类 UNIX 世界中成长起来的工具来说,违反这些约定是极不寻常的。

【讨论】:

感谢 ShadowRanger。 Martin Broadhurst 的回答(通过代码进行更多跟踪)证实了 Py_Main 文档。【参考方案2】:

如果你看cpython source code:

    main() in Programs/python.c 返回Py_Main()的返回值 Py_Main() in Modules/main.c 返回run_file() 的返回值 run_file(),同样在 Modules/main.c 返回 0 除非 PyRun_AnyFileExFlags() 返回非零 PyRun_AnyFileExFlags() in Python/pythonrun.cexit() in SystemExit 异常的事件,因此如果 脚本设置退出代码。如果有,它只会返回非零 是内部错误。

所以run_file() 的返回值是脚本默认退出代码0 的原因。

【讨论】:

【参考方案3】:

以 0 退出比 Python 早了很长时间,它是 POSIX standard 的一部分。所有表现良好的程序都以 0 表示成功退出。

【讨论】:

是的,我知道 0 长期以来一直是 *nix 标准,意味着没有错误。我只是想以书面形式(或在 Python 源代码中)看到它,如果没有异常、错误或明确的退出请求,它总是使用 0【参考方案4】:

Python 的默认退出代码为 0。此处记录了 https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit

但是,退出代码将是 exit()quit() 函数中指定的任何代码。因此,如果您使用的是脚本,则应始终在脚本或脚本文档中检查该特定脚本将返回的内容。例如:您可以在终端中启动 python,然后键入 quit(1),即使没有错误,它也会以返回码 1 退出。

【讨论】:

这不太正确,因为如果脚本不调用 sys.exit(),则不会引发 SystemExit

以上是关于Python 的默认退出代码是啥?的主要内容,如果未能解决你的问题,请参考以下文章

“进程以退出代码 1 结束”是啥意思?

JVM退出代码1073807364的原因是啥?

RPM 二进制文件中的退出代码是啥?

在此构建期间“以代码 9009 退出”是啥意思?

taskkill 实用程序的退出代码是啥?

Python 子进程——如何忽略退出代码警告?