什么是Python的默认退出码?

问题描述:

假设你的Python脚本不会由于任何类型的故障(异常,语法错误)而退出,并且该脚本不会由于sys.exit或os._exit而退出,那么Python如何找出退出的代码?什么是Python的默认退出码?

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

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)在python.c通过调用Py_Main并返回无论它返回来实现;每对Py_Main的记载担保,退出状态是:

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

请注意,如果以其他方式未处理的SystemExit被触发,该函数将不会返回1,但只要不设置Py_InspectFlag就退出进程。

所以这意味着简单地流失了__main__模块末尾,没有活动异常应该总是返回0的CPython的,虽然备用口译在技术上不要求做同样的。

+0

感谢ShadowRanger。 Martin Broadhurst的答案(通过代码追踪更多)证实了Py_Main文档。 –

用0退出Python比Python早了很长时间,它是POSIX standard的一部分。所有乖巧的方案表明以0

+0

是的,我知道0一直是* nix标准,意思是无错误。我只想以书面形式(或在Python源代码中)看到它总是使用0,如果没有异常,错误或显式请求退出 –

Python的默认退出代码成功退出为0。这是这里https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit

记载然而,退出代码将是无论在exit()quit()功能指定。因此,如果您正在使用脚本,则应始终在脚本或脚本文档中检查该特定脚本将返回的内容。例如:你可以在终端中启动python,只需键入quit(1),即使没有错误,它也会返回代码1。

+2

这不太正确,因为如果脚本没有引发'SystemExit'不调用'sys.exit()'。 –

如果你看一下cpython source code

  1. main()Programs/python.c回报Py_Main()
  2. Py_Main()Modules/main.c回报run_file()
  3. run_file()返回值的返回值,也Modules/main.c回报0除非PyRun_AnyFileExFlags()返回非零值
  4. PyRun_AnyFileExFlags()Python/pythonrun.cexit()在 事件的一个SystemExit异常,如果 脚本设置退出代码将不会返回。它只会返回非零值,如果 是内部错误。

所以run_file()的返回值是什么使得脚本0的默认退出码。