什么是Python的默认退出码?
假设你的Python脚本不会由于任何类型的故障(异常,语法错误)而退出,并且该脚本不会由于sys.exit或os._exit而退出,那么Python如何找出退出的代码?什么是Python的默认退出码?
它似乎是0,这很有意义,因为它指示* nix系统上没有错误。但是,情况总是如此,它以0结束(上述情况除外)?令人惊讶的是,经过相当多的在线搜索后,除非另有说明,否则我找不到任何明确表示将以0退出的内容。
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
)在python.c
通过调用Py_Main
并返回无论它返回来实现;每对Py_Main
的记载担保,退出状态是:
0
如果解释正常(即没有一个例外)退出,1
如果解释退出由于异常,或者2
如果参数列表不代表一个有效的Python命令行。请注意,如果以其他方式未处理的
SystemExit
被触发,该函数将不会返回1
,但只要不设置Py_InspectFlag
就退出进程。
所以这意味着简单地流失了__main__
模块末尾,没有活动异常应该总是返回0
的CPython的,虽然备用口译在技术上不要求做同样的。
用0退出Python比Python早了很长时间,它是POSIX standard的一部分。所有乖巧的方案表明以0
是的,我知道0一直是* nix标准,意思是无错误。我只想以书面形式(或在Python源代码中)看到它总是使用0,如果没有异常,错误或显式请求退出 –
Python的默认退出代码成功退出为0。这是这里https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit
记载然而,退出代码将是无论在exit()
或quit()
功能指定。因此,如果您正在使用脚本,则应始终在脚本或脚本文档中检查该特定脚本将返回的内容。例如:你可以在终端中启动python,只需键入quit(1)
,即使没有错误,它也会返回代码1。
这不太正确,因为如果脚本没有引发'SystemExit'不调用'sys.exit()'。 –
如果你看一下cpython source code:
-
main()
在Programs/python.c
回报Py_Main()
-
Py_Main()
在Modules/main.c
回报run_file()
-
run_file()
返回值的返回值,也Modules/main.c
回报0
除非PyRun_AnyFileExFlags()
返回非零值 -
PyRun_AnyFileExFlags()
在Python/pythonrun.c
将exit()
在 事件的一个SystemExit
异常,如果 脚本设置退出代码将不会返回。它只会返回非零值,如果 是内部错误。
所以run_file()
的返回值是什么使得脚本0
的默认退出码。
感谢ShadowRanger。 Martin Broadhurst的答案(通过代码追踪更多)证实了Py_Main文档。 –