mirror of
https://github.com/python/cpython.git
synced 2026-02-22 07:00:51 +00:00
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Benedikt Johannes <benedikt.johannes.hofer@gmail.com>
797 lines
29 KiB
ReStructuredText
797 lines
29 KiB
ReStructuredText
.. highlight:: c
|
|
|
|
.. _initialization:
|
|
|
|
Interpreter initialization and finalization
|
|
===========================================
|
|
|
|
See :ref:`Python Initialization Configuration <init-config>` for details
|
|
on how to configure the interpreter prior to initialization.
|
|
|
|
.. _pre-init-safe:
|
|
|
|
Before Python initialization
|
|
----------------------------
|
|
|
|
In an application embedding Python, the :c:func:`Py_Initialize` function must
|
|
be called before using any other Python/C API functions; with the exception of
|
|
a few functions and the :ref:`global configuration variables
|
|
<global-conf-vars>`.
|
|
|
|
The following functions can be safely called before Python is initialized:
|
|
|
|
* Functions that initialize the interpreter:
|
|
|
|
* :c:func:`Py_Initialize`
|
|
* :c:func:`Py_InitializeEx`
|
|
* :c:func:`Py_InitializeFromConfig`
|
|
* :c:func:`Py_BytesMain`
|
|
* :c:func:`Py_Main`
|
|
* the runtime pre-initialization functions covered in :ref:`init-config`
|
|
|
|
* Configuration functions:
|
|
|
|
* :c:func:`PyImport_AppendInittab`
|
|
* :c:func:`PyImport_ExtendInittab`
|
|
* :c:func:`!PyInitFrozenExtensions`
|
|
* :c:func:`PyMem_SetAllocator`
|
|
* :c:func:`PyMem_SetupDebugHooks`
|
|
* :c:func:`PyObject_SetArenaAllocator`
|
|
* :c:func:`Py_SetProgramName`
|
|
* :c:func:`Py_SetPythonHome`
|
|
* the configuration functions covered in :ref:`init-config`
|
|
|
|
* Informative functions:
|
|
|
|
* :c:func:`Py_IsInitialized`
|
|
* :c:func:`PyMem_GetAllocator`
|
|
* :c:func:`PyObject_GetArenaAllocator`
|
|
* :c:func:`Py_GetBuildInfo`
|
|
* :c:func:`Py_GetCompiler`
|
|
* :c:func:`Py_GetCopyright`
|
|
* :c:func:`Py_GetPlatform`
|
|
* :c:func:`Py_GetVersion`
|
|
* :c:func:`Py_IsInitialized`
|
|
|
|
* Utilities:
|
|
|
|
* :c:func:`Py_DecodeLocale`
|
|
* the status reporting and utility functions covered in :ref:`init-config`
|
|
|
|
* Memory allocators:
|
|
|
|
* :c:func:`PyMem_RawMalloc`
|
|
* :c:func:`PyMem_RawRealloc`
|
|
* :c:func:`PyMem_RawCalloc`
|
|
* :c:func:`PyMem_RawFree`
|
|
|
|
* Synchronization:
|
|
|
|
* :c:func:`PyMutex_Lock`
|
|
* :c:func:`PyMutex_Unlock`
|
|
|
|
.. note::
|
|
|
|
Despite their apparent similarity to some of the functions listed above,
|
|
the following functions **should not be called** before the interpreter has
|
|
been initialized: :c:func:`Py_EncodeLocale`, :c:func:`PyEval_InitThreads`, and
|
|
:c:func:`Py_RunMain`.
|
|
|
|
|
|
.. _global-conf-vars:
|
|
|
|
Global configuration variables
|
|
------------------------------
|
|
|
|
Python has variables for the global configuration to control different features
|
|
and options. By default, these flags are controlled by :ref:`command line
|
|
options <using-on-interface-options>`.
|
|
|
|
When a flag is set by an option, the value of the flag is the number of times
|
|
that the option was set. For example, ``-b`` sets :c:data:`Py_BytesWarningFlag`
|
|
to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2.
|
|
|
|
|
|
.. c:var:: int Py_BytesWarningFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.bytes_warning` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
Issue a warning when comparing :class:`bytes` or :class:`bytearray` with
|
|
:class:`str` or :class:`bytes` with :class:`int`. Issue an error if greater
|
|
or equal to ``2``.
|
|
|
|
Set by the :option:`-b` option.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_DebugFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.parser_debug` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
Turn on parser debugging output (for expert only, depending on compilation
|
|
options).
|
|
|
|
Set by the :option:`-d` option and the :envvar:`PYTHONDEBUG` environment
|
|
variable.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_DontWriteBytecodeFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.write_bytecode` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
If set to non-zero, Python won't try to write ``.pyc`` files on the
|
|
import of source modules.
|
|
|
|
Set by the :option:`-B` option and the :envvar:`PYTHONDONTWRITEBYTECODE`
|
|
environment variable.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_FrozenFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.pathconfig_warnings` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
Private flag used by ``_freeze_module`` and ``frozenmain`` programs.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_HashRandomizationFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.hash_seed` and :c:member:`PyConfig.use_hash_seed` should
|
|
be used instead, see :ref:`Python Initialization Configuration
|
|
<init-config>`.
|
|
|
|
Set to ``1`` if the :envvar:`PYTHONHASHSEED` environment variable is set to
|
|
a non-empty string.
|
|
|
|
If the flag is non-zero, read the :envvar:`PYTHONHASHSEED` environment
|
|
variable to initialize the secret hash seed.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_IgnoreEnvironmentFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.use_environment` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
Ignore all :envvar:`!PYTHON*` environment variables, e.g.
|
|
:envvar:`PYTHONPATH` and :envvar:`PYTHONHOME`, that might be set.
|
|
|
|
Set by the :option:`-E` and :option:`-I` options.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_InspectFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.inspect` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
When a script is passed as first argument or the :option:`-c` option is used,
|
|
enter interactive mode after executing the script or the command, even when
|
|
:data:`sys.stdin` does not appear to be a terminal.
|
|
|
|
Set by the :option:`-i` option and the :envvar:`PYTHONINSPECT` environment
|
|
variable.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_InteractiveFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.interactive` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
Set by the :option:`-i` option.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_IsolatedFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.isolated` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
Run Python in isolated mode. In isolated mode :data:`sys.path` contains
|
|
neither the script's directory nor the user's site-packages directory.
|
|
|
|
Set by the :option:`-I` option.
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_LegacyWindowsFSEncodingFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyPreConfig.legacy_windows_fs_encoding` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
If the flag is non-zero, use the ``mbcs`` encoding with ``replace`` error
|
|
handler, instead of the UTF-8 encoding with ``surrogatepass`` error handler,
|
|
for the :term:`filesystem encoding and error handler`.
|
|
|
|
Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment
|
|
variable is set to a non-empty string.
|
|
|
|
See :pep:`529` for more details.
|
|
|
|
.. availability:: Windows.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_LegacyWindowsStdioFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.legacy_windows_stdio` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
If the flag is non-zero, use :class:`io.FileIO` instead of
|
|
:class:`!io._WindowsConsoleIO` for :mod:`sys` standard streams.
|
|
|
|
Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSSTDIO` environment
|
|
variable is set to a non-empty string.
|
|
|
|
See :pep:`528` for more details.
|
|
|
|
.. availability:: Windows.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_NoSiteFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.site_import` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
Disable the import of the module :mod:`site` and the site-dependent
|
|
manipulations of :data:`sys.path` that it entails. Also disable these
|
|
manipulations if :mod:`site` is explicitly imported later (call
|
|
:func:`site.main` if you want them to be triggered).
|
|
|
|
Set by the :option:`-S` option.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_NoUserSiteDirectory
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.user_site_directory` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
Don't add the :data:`user site-packages directory <site.USER_SITE>` to
|
|
:data:`sys.path`.
|
|
|
|
Set by the :option:`-s` and :option:`-I` options, and the
|
|
:envvar:`PYTHONNOUSERSITE` environment variable.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_OptimizeFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.optimization_level` should be used instead, see
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
Set by the :option:`-O` option and the :envvar:`PYTHONOPTIMIZE` environment
|
|
variable.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_QuietFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.quiet` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
Don't display the copyright and version messages even in interactive mode.
|
|
|
|
Set by the :option:`-q` option.
|
|
|
|
.. versionadded:: 3.2
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_UnbufferedStdioFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.buffered_stdio` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
Force the stdout and stderr streams to be unbuffered.
|
|
|
|
Set by the :option:`-u` option and the :envvar:`PYTHONUNBUFFERED`
|
|
environment variable.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
.. c:var:: int Py_VerboseFlag
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.verbose` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
Print a message each time a module is initialized, showing the place
|
|
(filename or built-in module) from which it is loaded. If greater or equal
|
|
to ``2``, print a message for each file that is checked for when
|
|
searching for a module. Also provides information on module cleanup at exit.
|
|
|
|
Set by the :option:`-v` option and the :envvar:`PYTHONVERBOSE` environment
|
|
variable.
|
|
|
|
.. deprecated-removed:: 3.12 3.15
|
|
|
|
|
|
Initializing and finalizing the interpreter
|
|
-------------------------------------------
|
|
|
|
.. c:function:: void Py_Initialize()
|
|
|
|
.. index::
|
|
single: PyEval_InitThreads()
|
|
single: modules (in module sys)
|
|
single: path (in module sys)
|
|
pair: module; builtins
|
|
pair: module; __main__
|
|
pair: module; sys
|
|
triple: module; search; path
|
|
single: Py_FinalizeEx (C function)
|
|
|
|
Initialize the Python interpreter. In an application embedding Python,
|
|
this should be called before using any other Python/C API functions; see
|
|
:ref:`Before Python Initialization <pre-init-safe>` for the few exceptions.
|
|
|
|
This initializes the table of loaded modules (``sys.modules``), and creates
|
|
the fundamental modules :mod:`builtins`, :mod:`__main__` and :mod:`sys`.
|
|
It also initializes the module search path (``sys.path``). It does not set
|
|
``sys.argv``; use the :ref:`Python Initialization Configuration <init-config>`
|
|
API for that. This is a no-op when called for a second time (without calling
|
|
:c:func:`Py_FinalizeEx` first). There is no return value; it is a fatal
|
|
error if the initialization fails.
|
|
|
|
Use :c:func:`Py_InitializeFromConfig` to customize the
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
.. note::
|
|
On Windows, changes the console mode from ``O_TEXT`` to ``O_BINARY``,
|
|
which will also affect non-Python uses of the console using the C Runtime.
|
|
|
|
|
|
.. c:function:: void Py_InitializeEx(int initsigs)
|
|
|
|
This function works like :c:func:`Py_Initialize` if *initsigs* is ``1``. If
|
|
*initsigs* is ``0``, it skips initialization registration of signal handlers,
|
|
which may be useful when CPython is embedded as part of a larger application.
|
|
|
|
Use :c:func:`Py_InitializeFromConfig` to customize the
|
|
:ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
|
|
.. c:function:: PyStatus Py_InitializeFromConfig(const PyConfig *config)
|
|
|
|
Initialize Python from *config* configuration, as described in
|
|
:ref:`init-from-config`.
|
|
|
|
See the :ref:`init-config` section for details on pre-initializing the
|
|
interpreter, populating the runtime configuration structure, and querying
|
|
the returned status structure.
|
|
|
|
|
|
.. c:function:: int Py_IsInitialized()
|
|
|
|
Return true (nonzero) when the Python interpreter has been initialized, false
|
|
(zero) if not. After :c:func:`Py_FinalizeEx` is called, this returns false until
|
|
:c:func:`Py_Initialize` is called again.
|
|
|
|
|
|
.. c:function:: int Py_IsFinalizing()
|
|
|
|
Return true (non-zero) if the main Python interpreter is
|
|
:term:`shutting down <interpreter shutdown>`. Return false (zero) otherwise.
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
|
|
.. c:function:: int Py_FinalizeEx()
|
|
|
|
Undo all initializations made by :c:func:`Py_Initialize` and subsequent use of
|
|
Python/C API functions, and destroy all sub-interpreters (see
|
|
:c:func:`Py_NewInterpreter` below) that were created and not yet destroyed since
|
|
the last call to :c:func:`Py_Initialize`. This is a no-op when called for a second
|
|
time (without calling :c:func:`Py_Initialize` again first).
|
|
|
|
Since this is the reverse of :c:func:`Py_Initialize`, it should be called
|
|
in the same thread with the same interpreter active. That means
|
|
the main thread and the main interpreter.
|
|
This should never be called while :c:func:`Py_RunMain` is running.
|
|
|
|
Normally the return value is ``0``.
|
|
If there were errors during finalization (flushing buffered data),
|
|
``-1`` is returned.
|
|
|
|
Note that Python will do a best effort at freeing all memory allocated by the Python
|
|
interpreter. Therefore, any C-Extension should make sure to correctly clean up all
|
|
of the previously allocated PyObjects before using them in subsequent calls to
|
|
:c:func:`Py_Initialize`. Otherwise it could introduce vulnerabilities and incorrect
|
|
behavior.
|
|
|
|
This function is provided for a number of reasons. An embedding application
|
|
might want to restart Python without having to restart the application itself.
|
|
An application that has loaded the Python interpreter from a dynamically
|
|
loadable library (or DLL) might want to free all memory allocated by Python
|
|
before unloading the DLL. During a hunt for memory leaks in an application a
|
|
developer might want to free all memory allocated by Python before exiting from
|
|
the application.
|
|
|
|
**Bugs and caveats:** The destruction of modules and objects in modules is done
|
|
in random order; this may cause destructors (:meth:`~object.__del__` methods) to fail
|
|
when they depend on other objects (even functions) or modules. Dynamically
|
|
loaded extension modules loaded by Python are not unloaded. Small amounts of
|
|
memory allocated by the Python interpreter may not be freed (if you find a leak,
|
|
please report it). Memory tied up in circular references between objects is not
|
|
freed. Interned strings will all be deallocated regardless of their reference count.
|
|
Some memory allocated by extension modules may not be freed. Some extensions may not
|
|
work properly if their initialization routine is called more than once; this can
|
|
happen if an application calls :c:func:`Py_Initialize` and :c:func:`Py_FinalizeEx`
|
|
more than once. :c:func:`Py_FinalizeEx` must not be called recursively from
|
|
within itself. Therefore, it must not be called by any code that may be run
|
|
as part of the interpreter shutdown process, such as :py:mod:`atexit`
|
|
handlers, object finalizers, or any code that may be run while flushing the
|
|
stdout and stderr files.
|
|
|
|
.. audit-event:: cpython._PySys_ClearAuditHooks "" c.Py_FinalizeEx
|
|
|
|
.. versionadded:: 3.6
|
|
|
|
|
|
.. c:function:: void Py_Finalize()
|
|
|
|
This is a backwards-compatible version of :c:func:`Py_FinalizeEx` that
|
|
disregards the return value.
|
|
|
|
|
|
.. c:function:: int Py_BytesMain(int argc, char **argv)
|
|
|
|
Similar to :c:func:`Py_Main` but *argv* is an array of bytes strings,
|
|
allowing the calling application to delegate the text decoding step to
|
|
the CPython runtime.
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
|
|
.. c:function:: int Py_Main(int argc, wchar_t **argv)
|
|
|
|
The main program for the standard interpreter, encapsulating a full
|
|
initialization/finalization cycle, as well as additional
|
|
behaviour to implement reading configurations settings from the environment
|
|
and command line, and then executing ``__main__`` in accordance with
|
|
:ref:`using-on-cmdline`.
|
|
|
|
This is made available for programs which wish to support the full CPython
|
|
command line interface, rather than just embedding a Python runtime in a
|
|
larger application.
|
|
|
|
The *argc* and *argv* parameters are similar to those which are passed to a
|
|
C program's :c:func:`main` function, except that the *argv* entries are first
|
|
converted to ``wchar_t`` using :c:func:`Py_DecodeLocale`. It is also
|
|
important to note that the argument list entries may be modified to point to
|
|
strings other than those passed in (however, the contents of the strings
|
|
pointed to by the argument list are not modified).
|
|
|
|
The return value is ``2`` if the argument list does not represent a valid
|
|
Python command line, and otherwise the same as :c:func:`Py_RunMain`.
|
|
|
|
In terms of the CPython runtime configuration APIs documented in the
|
|
:ref:`runtime configuration <init-config>` section (and without accounting
|
|
for error handling), ``Py_Main`` is approximately equivalent to::
|
|
|
|
PyConfig config;
|
|
PyConfig_InitPythonConfig(&config);
|
|
PyConfig_SetArgv(&config, argc, argv);
|
|
Py_InitializeFromConfig(&config);
|
|
PyConfig_Clear(&config);
|
|
|
|
Py_RunMain();
|
|
|
|
In normal usage, an embedding application will call this function
|
|
*instead* of calling :c:func:`Py_Initialize`, :c:func:`Py_InitializeEx` or
|
|
:c:func:`Py_InitializeFromConfig` directly, and all settings will be applied
|
|
as described elsewhere in this documentation. If this function is instead
|
|
called *after* a preceding runtime initialization API call, then exactly
|
|
which environmental and command line configuration settings will be updated
|
|
is version dependent (as it depends on which settings correctly support
|
|
being modified after they have already been set once when the runtime was
|
|
first initialized).
|
|
|
|
|
|
.. c:function:: int Py_RunMain(void)
|
|
|
|
Executes the main module in a fully configured CPython runtime.
|
|
|
|
Executes the command (:c:member:`PyConfig.run_command`), the script
|
|
(:c:member:`PyConfig.run_filename`) or the module
|
|
(:c:member:`PyConfig.run_module`) specified on the command line or in the
|
|
configuration. If none of these values are set, runs the interactive Python
|
|
prompt (REPL) using the ``__main__`` module's global namespace.
|
|
|
|
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
|
|
an exception), the exit status of an unhandled :exc:`SystemExit`, or ``1``
|
|
for any other unhandled exception.
|
|
|
|
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
|
|
instead resume in an interactive Python prompt (REPL) using the ``__main__``
|
|
module's global namespace. If the interpreter exited with an exception, it
|
|
is immediately raised in the REPL session. The function return value is
|
|
then determined by the way the *REPL session* terminates: ``0``, ``1``, or
|
|
the status of a :exc:`SystemExit`, as specified above.
|
|
|
|
This function always finalizes the Python interpreter before it returns.
|
|
|
|
See :ref:`Python Configuration <init-python-config>` for an example of a
|
|
customized Python that always runs in isolated mode using
|
|
:c:func:`Py_RunMain`.
|
|
|
|
.. c:function:: int PyUnstable_AtExit(PyInterpreterState *interp, void (*func)(void *), void *data)
|
|
|
|
Register an :mod:`atexit` callback for the target interpreter *interp*.
|
|
This is similar to :c:func:`Py_AtExit`, but takes an explicit interpreter and
|
|
data pointer for the callback.
|
|
|
|
There must be an :term:`attached thread state` for *interp*.
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
|
|
.. _cautions-regarding-runtime-finalization:
|
|
|
|
Cautions regarding runtime finalization
|
|
---------------------------------------
|
|
|
|
In the late stage of :term:`interpreter shutdown`, after attempting to wait for
|
|
non-daemon threads to exit (though this can be interrupted by
|
|
:class:`KeyboardInterrupt`) and running the :mod:`atexit` functions, the runtime
|
|
is marked as *finalizing*: :c:func:`Py_IsFinalizing` and
|
|
:func:`sys.is_finalizing` return true. At this point, only the *finalization
|
|
thread* that initiated finalization (typically the main thread) is allowed to
|
|
acquire the :term:`GIL`.
|
|
|
|
If any thread, other than the finalization thread, attempts to attach a :term:`thread state`
|
|
during finalization, either explicitly or
|
|
implicitly, the thread enters **a permanently blocked state**
|
|
where it remains until the program exits. In most cases this is harmless, but this can result
|
|
in deadlock if a later stage of finalization attempts to acquire a lock owned by the
|
|
blocked thread, or otherwise waits on the blocked thread.
|
|
|
|
Gross? Yes. This prevents random crashes and/or unexpectedly skipped C++
|
|
finalizations further up the call stack when such threads were forcibly exited
|
|
here in CPython 3.13 and earlier. The CPython runtime :term:`thread state` C APIs
|
|
have never had any error reporting or handling expectations at :term:`thread state`
|
|
attachment time that would've allowed for graceful exit from this situation. Changing that
|
|
would require new stable C APIs and rewriting the majority of C code in the
|
|
CPython ecosystem to use those with error handling.
|
|
|
|
|
|
Process-wide parameters
|
|
-----------------------
|
|
|
|
.. c:function:: void Py_SetProgramName(const wchar_t *name)
|
|
|
|
.. index::
|
|
single: Py_Initialize()
|
|
single: main()
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.program_name` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
This function should be called before :c:func:`Py_Initialize` is called for
|
|
the first time, if it is called at all. It tells the interpreter the value
|
|
of the ``argv[0]`` argument to the :c:func:`main` function of the program
|
|
(converted to wide characters).
|
|
This is used by some other functions below to find
|
|
the Python run-time libraries relative to the interpreter executable. The
|
|
default value is ``'python'``. The argument should point to a
|
|
zero-terminated wide character string in static storage whose contents will not
|
|
change for the duration of the program's execution. No code in the Python
|
|
interpreter will change the contents of this storage.
|
|
|
|
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
|
|
:c:expr:`wchar_t*` string.
|
|
|
|
.. deprecated-removed:: 3.11 3.15
|
|
|
|
|
|
.. c:function:: const char* Py_GetVersion()
|
|
|
|
Return the version of this Python interpreter. This is a string that looks
|
|
something like ::
|
|
|
|
"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]"
|
|
|
|
.. index:: single: version (in module sys)
|
|
|
|
The first word (up to the first space character) is the current Python version;
|
|
the first characters are the major and minor version separated by a
|
|
period. The returned string points into static storage; the caller should not
|
|
modify its value. The value is available to Python code as :data:`sys.version`.
|
|
|
|
See also the :c:var:`Py_Version` constant.
|
|
|
|
|
|
.. c:function:: const char* Py_GetPlatform()
|
|
|
|
.. index:: single: platform (in module sys)
|
|
|
|
Return the platform identifier for the current platform. On Unix, this is
|
|
formed from the "official" name of the operating system, converted to lower
|
|
case, followed by the major revision number; e.g., for Solaris 2.x, which is
|
|
also known as SunOS 5.x, the value is ``'sunos5'``. On macOS, it is
|
|
``'darwin'``. On Windows, it is ``'win'``. The returned string points into
|
|
static storage; the caller should not modify its value. The value is available
|
|
to Python code as ``sys.platform``.
|
|
|
|
|
|
.. c:function:: const char* Py_GetCopyright()
|
|
|
|
Return the official copyright string for the current Python version, for example
|
|
|
|
``'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'``
|
|
|
|
.. index:: single: copyright (in module sys)
|
|
|
|
The returned string points into static storage; the caller should not modify its
|
|
value. The value is available to Python code as ``sys.copyright``.
|
|
|
|
|
|
.. c:function:: const char* Py_GetCompiler()
|
|
|
|
Return an indication of the compiler used to build the current Python version,
|
|
in square brackets, for example::
|
|
|
|
"[GCC 2.7.2.2]"
|
|
|
|
.. index:: single: version (in module sys)
|
|
|
|
The returned string points into static storage; the caller should not modify its
|
|
value. The value is available to Python code as part of the variable
|
|
``sys.version``.
|
|
|
|
|
|
.. c:function:: const char* Py_GetBuildInfo()
|
|
|
|
Return information about the sequence number and build date and time of the
|
|
current Python interpreter instance, for example ::
|
|
|
|
"#67, Aug 1 1997, 22:34:28"
|
|
|
|
.. index:: single: version (in module sys)
|
|
|
|
The returned string points into static storage; the caller should not modify its
|
|
value. The value is available to Python code as part of the variable
|
|
``sys.version``.
|
|
|
|
|
|
.. c:function:: void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
|
|
|
|
.. index::
|
|
single: main()
|
|
single: Py_FatalError()
|
|
single: argv (in module sys)
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.argv`, :c:member:`PyConfig.parse_argv` and
|
|
:c:member:`PyConfig.safe_path` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
Set :data:`sys.argv` based on *argc* and *argv*. These parameters are
|
|
similar to those passed to the program's :c:func:`main` function with the
|
|
difference that the first entry should refer to the script file to be
|
|
executed rather than the executable hosting the Python interpreter. If there
|
|
isn't a script that will be run, the first entry in *argv* can be an empty
|
|
string. If this function fails to initialize :data:`sys.argv`, a fatal
|
|
condition is signalled using :c:func:`Py_FatalError`.
|
|
|
|
If *updatepath* is zero, this is all the function does. If *updatepath*
|
|
is non-zero, the function also modifies :data:`sys.path` according to the
|
|
following algorithm:
|
|
|
|
- If the name of an existing script is passed in ``argv[0]``, the absolute
|
|
path of the directory where the script is located is prepended to
|
|
:data:`sys.path`.
|
|
- Otherwise (that is, if *argc* is ``0`` or ``argv[0]`` doesn't point
|
|
to an existing file name), an empty string is prepended to
|
|
:data:`sys.path`, which is the same as prepending the current working
|
|
directory (``"."``).
|
|
|
|
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
|
|
:c:expr:`wchar_t*` string.
|
|
|
|
See also :c:member:`PyConfig.orig_argv` and :c:member:`PyConfig.argv`
|
|
members of the :ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
.. note::
|
|
It is recommended that applications embedding the Python interpreter
|
|
for purposes other than executing a single script pass ``0`` as *updatepath*,
|
|
and update :data:`sys.path` themselves if desired.
|
|
See :cve:`2008-5983`.
|
|
|
|
On versions before 3.1.3, you can achieve the same effect by manually
|
|
popping the first :data:`sys.path` element after having called
|
|
:c:func:`PySys_SetArgv`, for example using::
|
|
|
|
PyRun_SimpleString("import sys; sys.path.pop(0)\n");
|
|
|
|
.. versionadded:: 3.1.3
|
|
|
|
.. deprecated-removed:: 3.11 3.15
|
|
|
|
|
|
.. c:function:: void PySys_SetArgv(int argc, wchar_t **argv)
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.argv` and :c:member:`PyConfig.parse_argv` should be used
|
|
instead, see :ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
This function works like :c:func:`PySys_SetArgvEx` with *updatepath* set
|
|
to ``1`` unless the :program:`python` interpreter was started with the
|
|
:option:`-I`.
|
|
|
|
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
|
|
:c:expr:`wchar_t*` string.
|
|
|
|
See also :c:member:`PyConfig.orig_argv` and :c:member:`PyConfig.argv`
|
|
members of the :ref:`Python Initialization Configuration <init-config>`.
|
|
|
|
.. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`.
|
|
|
|
.. deprecated-removed:: 3.11 3.15
|
|
|
|
|
|
.. c:function:: void Py_SetPythonHome(const wchar_t *home)
|
|
|
|
This API is kept for backward compatibility: setting
|
|
:c:member:`PyConfig.home` should be used instead, see :ref:`Python
|
|
Initialization Configuration <init-config>`.
|
|
|
|
Set the default "home" directory, that is, the location of the standard
|
|
Python libraries. See :envvar:`PYTHONHOME` for the meaning of the
|
|
argument string.
|
|
|
|
The argument should point to a zero-terminated character string in static
|
|
storage whose contents will not change for the duration of the program's
|
|
execution. No code in the Python interpreter will change the contents of
|
|
this storage.
|
|
|
|
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
|
|
:c:expr:`wchar_t*` string.
|
|
|
|
.. deprecated-removed:: 3.11 3.15
|