What is Python's default exit code?

If you look at the cpython source code:

  1. main() in Programs/python.c returns the return value of Py_Main()
  2. Py_Main() in Modules/main.c returns the return value of run_file()
  3. run_file(), also in Modules/main.c returns 0 unless PyRun_AnyFileExFlags() returns non-zero
  4. PyRun_AnyFileExFlags() in Python/pythonrun.c will exit() in the event of a SystemExit exception and so will not return if the script sets an exit code. It will only return non-zero if there is an internal error.

So the return value of run_file() is what makes the default exit code of a script 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, but there is no documented guarantee I can find for the exit status in general.

Aside from that, the best I can give you is that in CPython, the python executable (including python.exe/pythonw.exe on Windows) is implemented in python.c by calling Py_Main and returning whatever it returns; per the documented guarantees on Py_Main, the exit status is:

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.

so this implies that simply running off the end of the __main__ module without an active exception should always return 0 for CPython, though alternate interpreters are not technically required to do the same.

This tracks with the implied exit status rules expected of most applications; while nothing explicitly says Python has to follow those rules, it would be extremely unusual for a tool that grew up in the command line UNIX-like world to violate those conventions.