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 0
和 os._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.c
将 exit()
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 的默认退出代码是啥?的主要内容,如果未能解决你的问题,请参考以下文章