假设您的脚本由于任何类型的失败而退出(异常,语法错误)并且脚本由于sys.exit()
或os._exit()
而退出,Python如何?找出要退出的退出代码?
它似乎是0,这是有道理的,因为它表示* nix系统没有错误。但是,它总是会以0退出(除上述情况除外)吗?令人惊讶的是,经过相当多的在线搜索后,除非另有说明,否则我无法找到明确表示会以0退出的任何内容。
答案 0 :(得分:3)
如果你看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
的返回值是脚本Select *, CASE WHEN COUNT(X.id ) >1 THEN 'X'
ELSE '' END AS testing
from TestTable
Group by *
的默认退出代码。
答案 1 :(得分:3)
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
并返回它返回的内容;根据{{1}}上记录的保证,退出状态为:
Py_Main
如果解释器正常退出(即没有例外),0
如果解释器由于异常而退出,或1
如果参数列表不表示有效Python命令行。请注意,如果引发了其他未处理的
2
,则此函数不会返回SystemExit
,但只要未设置1
,就会退出该过程。
所以这意味着在没有活动异常的情况下简单地运行Py_InspectFlag
模块的末尾应始终为CPython返回__main__
,尽管备用解释器在技术上不是 required 做同样的事。
答案 2 :(得分:1)
在0之前以0退出很长时间,它是POSIX standard的一部分。所有表现良好的程序都表示成功退出0。
答案 3 :(得分:1)
Python的默认退出代码为0.这在此处记录https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit
但是,退出代码将是<a href="newPage.htm" {{action 'emptyAction' preventDefault=false}}>Go</a>
或exit()
函数中指定的任何内容。因此,如果您使用的是脚本,则应始终在脚本或脚本文档中检查该特定脚本将返回的内容。例如:您可以在终端中启动python,只需键入quit()
,即使没有错误,它也会以返回码1退出。