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

What is Python's default exit code?

假设您的脚本没有因为任何类型的故障(异常、语法错误)而退出,并且脚本没有因为 sys.exit()os._exit() 而退出,Python 找出要退出的退出代码?

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

以 0 退出早于 Python 很久,它是 POSIX standard 的一部分。所有运行良好的程序都以 0 指示成功退出。

Python 的默认退出代码是 0。这在此处记录 https://docs.python.org/2/library/exceptions.html#exceptions.SystemExit

但是,退出代码将是 exit()quit() 函数中指定的任何内容。因此,如果您使用的是脚本,则应始终在脚本或脚本文档中检查该特定脚本将 return 的内容。例如:您可以在终端中启动 python,只需键入 quit(1),即使没有错误,它也会以 return 代码 1 退出。

如果你看 cpython source code:

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

因此 run_file() 的 return 值是脚本的默认退出代码 0

sys.exit documents a default exit status of 0, and os._exit's docs specify a UNIX-like OS constant for "normal" exit status, os.EX_OK,但我找不到一般退出状态的书面保证。

除此之外,我能给你的最好的是在 CPython 中,python 可执行文件(包括 python.exe/pythonw.exe on Windows) 在 python.c 中通过调用 Py_Main 和 return 来实现 return;根据 Py_Main 上记录的保证,退出状态为:

0 if the interpreter exits normally (i.e., without an exception), 1 if the interpreter exits due to an exception, or 2 if the parameter list does not represent a valid Python command line.

Note that if an otherwise unhandled SystemExit is raised, this function will not return 1, but exit the process, as long as Py_InspectFlag is not set.

所以这意味着只要 运行 关闭 __main__ 模块的末尾而没有活动异常应该始终 return 0 for CPython,尽管在技术上不需要替代口译员做同样的事情。

此曲目与the implied exit status rules expected of most applications;虽然没有明确说明 Python 必须遵循这些规则,但对于一个在类 UNIX 命令行世界中成长起来的工具来说,违反这些约定是非常不寻常的。