gh-133264: Correct documentation of how Py_Main and Py_RunMain handle SystemExit (#135337)

This commit is contained in:
Malcolm Smith 2025-06-11 16:23:47 +01:00 committed by GitHub
parent c87b5b2cb6
commit b706ff003c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -492,17 +492,8 @@ Initializing and finalizing the interpreter
strings other than those passed in (however, the contents of the strings strings other than those passed in (however, the contents of the strings
pointed to by the argument list are not modified). pointed to by the argument list are not modified).
The return value will be ``0`` if the interpreter exits normally (i.e., The return value is ``2`` if the argument list does not represent a valid
without an exception), ``1`` if the interpreter exits due to an exception, Python command line, and otherwise the same as :c:func:`Py_RunMain`.
or ``2`` if the argument list does not represent a valid Python command
line.
Note that if an otherwise unhandled :exc:`SystemExit` is raised, this
function will not return ``1``, but exit the process, as long as
``Py_InspectFlag`` is not set. If ``Py_InspectFlag`` is set, execution will
drop into the interactive Python prompt, at which point a second otherwise
unhandled :exc:`SystemExit` will still exit the process, while any other
means of exiting will set the return value as described above.
In terms of the CPython runtime configuration APIs documented in the In terms of the CPython runtime configuration APIs documented in the
:ref:`runtime configuration <init-config>` section (and without accounting :ref:`runtime configuration <init-config>` section (and without accounting
@ -539,23 +530,18 @@ Initializing and finalizing the interpreter
If :c:member:`PyConfig.inspect` is not set (the default), the return value If :c:member:`PyConfig.inspect` is not set (the default), the return value
will be ``0`` if the interpreter exits normally (that is, without raising will be ``0`` if the interpreter exits normally (that is, without raising
an exception), or ``1`` if the interpreter exits due to an exception. If an an exception), the exit status of an unhandled :exc:`SystemExit`, or ``1``
otherwise unhandled :exc:`SystemExit` is raised, the function will immediately for any other unhandled exception.
exit the process instead of returning ``1``.
If :c:member:`PyConfig.inspect` is set (such as when the :option:`-i` option If :c:member:`PyConfig.inspect` is set (such as when the :option:`-i` option
is used), rather than returning when the interpreter exits, execution will is used), rather than returning when the interpreter exits, execution will
instead resume in an interactive Python prompt (REPL) using the ``__main__`` instead resume in an interactive Python prompt (REPL) using the ``__main__``
module's global namespace. If the interpreter exited with an exception, it module's global namespace. If the interpreter exited with an exception, it
is immediately raised in the REPL session. The function return value is is immediately raised in the REPL session. The function return value is
then determined by the way the *REPL session* terminates: returning ``0`` then determined by the way the *REPL session* terminates: ``0``, ``1``, or
if the session terminates without raising an unhandled exception, exiting the status of a :exc:`SystemExit`, as specified above.
immediately for an unhandled :exc:`SystemExit`, and returning ``1`` for
any other unhandled exception.
This function always finalizes the Python interpreter regardless of whether This function always finalizes the Python interpreter before it returns.
it returns a value or immediately exits the process due to an unhandled
:exc:`SystemExit` exception.
See :ref:`Python Configuration <init-python-config>` for an example of a See :ref:`Python Configuration <init-python-config>` for an example of a
customized Python that always runs in isolated mode using customized Python that always runs in isolated mode using