Python的默认退出代码是什么?

9
假设你的脚本没有因任何类型的失败(异常、语法错误)而退出,并且脚本没有因sys.exit()os._exit()而退出,那么Python如何确定退出时要使用什么退出代码?
似乎是0,这很有道理,因为它在*nix系统上表示无错误。然而,它是否总是以0退出(除了上述情况)呢?令人惊讶的是,在进行了相当多的在线搜索之后,我发现没有明确说明它会以0退出,除非另有规定。
4个回答

10

sys.exit文档中指定了默认的退出状态为0,而os._exit的文档则指定了类UNIX操作系统下"正常"退出状态的常量os.EX_OK,但我找不到任何关于一般退出状态的保证。

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

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

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

因此,对于CPython来说,简单地在__main__模块的结尾处运行而没有活动异常应始终返回0,尽管其他解释器从技术上讲不一定需要这样做。

这符合大多数应用程序期望的隐含退出状态规则;虽然没有明确说明Python必须遵循这些规则,但对于在命令行UNIX类似世界中成长的工具来说,违反这些约定将是极不寻常的。


感谢ShadowRanger。Martin Broadhurst的回答(通过代码跟踪更多)证实了Py_Main文档。 - Jim Hoagland

8
如果你查看 cpython源代码
  1. Programs/python.c 中的 main() 返回 Py_Main() 的返回值
  2. Modules/main.c 中的 Py_Main() 返回 run_file() 的返回值
  3. Modules/main.c 中的 run_file() 返回 0,除非 PyRun_AnyFileExFlags() 返回非零
  4. Python/pythonrun.c 中的 PyRun_AnyFileExFlags() 在出现 SystemExit 异常时会调用 exit(),因此如果脚本设置了退出码,它将不会返回。仅当存在内部错误时,它才会返回非零。
所以 run_file() 的返回值决定了脚本的默认退出码为 0

1

退出状态码0比Python诞生的时间更早,它是POSIX标准的一部分。所有行为良好的程序都会使用0来表示成功退出。


2
是的,我知道0在*nix标准中长期以来一直表示没有错误。我只是想看到它的书面表述(或在Python源代码中),即如果没有异常、错误或明确要求退出,它总是使用0。 - Jim Hoagland

1

Python的默认退出代码是0。可以在这里https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit查看文档。

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


4
如果脚本没有调用sys.exit(),那么就不会引发SystemExit异常,因此这并不完全正确。 - user325117

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接