17db96d56Sopenharmony_ci.. highlight:: c
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci.. _init-config:
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci***********************************
67db96d56Sopenharmony_ciPython Initialization Configuration
77db96d56Sopenharmony_ci***********************************
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci.. versionadded:: 3.8
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciPython can be initialized with :c:func:`Py_InitializeFromConfig` and the
127db96d56Sopenharmony_ci:c:type:`PyConfig` structure. It can be preinitialized with
137db96d56Sopenharmony_ci:c:func:`Py_PreInitialize` and the :c:type:`PyPreConfig` structure.
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciThere are two kinds of configuration:
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci* The :ref:`Python Configuration <init-python-config>` can be used to build a
187db96d56Sopenharmony_ci  customized Python which behaves as the regular Python. For example,
197db96d56Sopenharmony_ci  environment variables and command line arguments are used to configure
207db96d56Sopenharmony_ci  Python.
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci* The :ref:`Isolated Configuration <init-isolated-conf>` can be used to embed
237db96d56Sopenharmony_ci  Python into an application. It isolates Python from the system. For example,
247db96d56Sopenharmony_ci  environment variables are ignored, the LC_CTYPE locale is left unchanged and
257db96d56Sopenharmony_ci  no signal handler is registered.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciThe :c:func:`Py_RunMain` function can be used to write a customized Python
287db96d56Sopenharmony_ciprogram.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ciSee also :ref:`Initialization, Finalization, and Threads <initialization>`.
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci.. seealso::
337db96d56Sopenharmony_ci   :pep:`587` "Python Initialization Configuration".
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciExample
377db96d56Sopenharmony_ci=======
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ciExample of customized Python always running in isolated mode::
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci    int main(int argc, char **argv)
427db96d56Sopenharmony_ci    {
437db96d56Sopenharmony_ci        PyStatus status;
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci        PyConfig config;
467db96d56Sopenharmony_ci        PyConfig_InitPythonConfig(&config);
477db96d56Sopenharmony_ci        config.isolated = 1;
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci        /* Decode command line arguments.
507db96d56Sopenharmony_ci           Implicitly preinitialize Python (in isolated mode). */
517db96d56Sopenharmony_ci        status = PyConfig_SetBytesArgv(&config, argc, argv);
527db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
537db96d56Sopenharmony_ci            goto exception;
547db96d56Sopenharmony_ci        }
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci        status = Py_InitializeFromConfig(&config);
577db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
587db96d56Sopenharmony_ci            goto exception;
597db96d56Sopenharmony_ci        }
607db96d56Sopenharmony_ci        PyConfig_Clear(&config);
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci        return Py_RunMain();
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci    exception:
657db96d56Sopenharmony_ci        PyConfig_Clear(&config);
667db96d56Sopenharmony_ci        if (PyStatus_IsExit(status)) {
677db96d56Sopenharmony_ci            return status.exitcode;
687db96d56Sopenharmony_ci        }
697db96d56Sopenharmony_ci        /* Display the error message and exit the process with
707db96d56Sopenharmony_ci           non-zero exit code */
717db96d56Sopenharmony_ci        Py_ExitStatusException(status);
727db96d56Sopenharmony_ci    }
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ciPyWideStringList
767db96d56Sopenharmony_ci================
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci.. c:type:: PyWideStringList
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci   List of ``wchar_t*`` strings.
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci   If *length* is non-zero, *items* must be non-``NULL`` and all strings must be
837db96d56Sopenharmony_ci   non-``NULL``.
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci   Methods:
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci   .. c:function:: PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci      Append *item* to *list*.
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci      Python must be preinitialized to call this function.
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci   .. c:function:: PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci      Insert *item* into *list* at *index*.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci      If *index* is greater than or equal to *list* length, append *item* to
987db96d56Sopenharmony_ci      *list*.
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci      *index* must be greater than or equal to ``0``.
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci      Python must be preinitialized to call this function.
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci   Structure fields:
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci   .. c:member:: Py_ssize_t length
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci      List length.
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci   .. c:member:: wchar_t** items
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci      List items.
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ciPyStatus
1157db96d56Sopenharmony_ci========
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci.. c:type:: PyStatus
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci   Structure to store an initialization function status: success, error
1207db96d56Sopenharmony_ci   or exit.
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   For an error, it can store the C function name which created the error.
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci   Structure fields:
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci   .. c:member:: int exitcode
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci      Exit code. Argument passed to ``exit()``.
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci   .. c:member:: const char *err_msg
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci      Error message.
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci   .. c:member:: const char *func
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci      Name of the function which created an error, can be ``NULL``.
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci   Functions to create a status:
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci   .. c:function:: PyStatus PyStatus_Ok(void)
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci      Success.
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   .. c:function:: PyStatus PyStatus_Error(const char *err_msg)
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci      Initialization error with a message.
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci      *err_msg* must not be ``NULL``.
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci   .. c:function:: PyStatus PyStatus_NoMemory(void)
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci      Memory allocation failure (out of memory).
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci   .. c:function:: PyStatus PyStatus_Exit(int exitcode)
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci      Exit Python with the specified exit code.
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci   Functions to handle a status:
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci   .. c:function:: int PyStatus_Exception(PyStatus status)
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci      Is the status an error or an exit? If true, the exception must be
1637db96d56Sopenharmony_ci      handled; by calling :c:func:`Py_ExitStatusException` for example.
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci   .. c:function:: int PyStatus_IsError(PyStatus status)
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci      Is the result an error?
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci   .. c:function:: int PyStatus_IsExit(PyStatus status)
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci      Is the result an exit?
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci   .. c:function:: void Py_ExitStatusException(PyStatus status)
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci      Call ``exit(exitcode)`` if *status* is an exit. Print the error
1767db96d56Sopenharmony_ci      message and exit with a non-zero exit code if *status* is an error.  Must
1777db96d56Sopenharmony_ci      only be called if ``PyStatus_Exception(status)`` is non-zero.
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci.. note::
1807db96d56Sopenharmony_ci   Internally, Python uses macros which set ``PyStatus.func``,
1817db96d56Sopenharmony_ci   whereas functions to create a status set ``func`` to ``NULL``.
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciExample::
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    PyStatus alloc(void **ptr, size_t size)
1867db96d56Sopenharmony_ci    {
1877db96d56Sopenharmony_ci        *ptr = PyMem_RawMalloc(size);
1887db96d56Sopenharmony_ci        if (*ptr == NULL) {
1897db96d56Sopenharmony_ci            return PyStatus_NoMemory();
1907db96d56Sopenharmony_ci        }
1917db96d56Sopenharmony_ci        return PyStatus_Ok();
1927db96d56Sopenharmony_ci    }
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci    int main(int argc, char **argv)
1957db96d56Sopenharmony_ci    {
1967db96d56Sopenharmony_ci        void *ptr;
1977db96d56Sopenharmony_ci        PyStatus status = alloc(&ptr, 16);
1987db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
1997db96d56Sopenharmony_ci            Py_ExitStatusException(status);
2007db96d56Sopenharmony_ci        }
2017db96d56Sopenharmony_ci        PyMem_Free(ptr);
2027db96d56Sopenharmony_ci        return 0;
2037db96d56Sopenharmony_ci    }
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ciPyPreConfig
2077db96d56Sopenharmony_ci===========
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci.. c:type:: PyPreConfig
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci   Structure used to preinitialize Python.
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci   Function to initialize a preconfiguration:
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci   .. c:function:: void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci      Initialize the preconfiguration with :ref:`Python Configuration
2187db96d56Sopenharmony_ci      <init-python-config>`.
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci   .. c:function:: void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci      Initialize the preconfiguration with :ref:`Isolated Configuration
2237db96d56Sopenharmony_ci      <init-isolated-conf>`.
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci   Structure fields:
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci   .. c:member:: int allocator
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci      Name of the Python memory allocators:
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci      * ``PYMEM_ALLOCATOR_NOT_SET`` (``0``): don't change memory allocators
2327db96d56Sopenharmony_ci        (use defaults).
2337db96d56Sopenharmony_ci      * ``PYMEM_ALLOCATOR_DEFAULT`` (``1``): :ref:`default memory allocators
2347db96d56Sopenharmony_ci        <default-memory-allocators>`.
2357db96d56Sopenharmony_ci      * ``PYMEM_ALLOCATOR_DEBUG`` (``2``): :ref:`default memory allocators
2367db96d56Sopenharmony_ci        <default-memory-allocators>` with :ref:`debug hooks
2377db96d56Sopenharmony_ci        <pymem-debug-hooks>`.
2387db96d56Sopenharmony_ci      * ``PYMEM_ALLOCATOR_MALLOC`` (``3``): use ``malloc()`` of the C library.
2397db96d56Sopenharmony_ci      * ``PYMEM_ALLOCATOR_MALLOC_DEBUG`` (``4``): force usage of
2407db96d56Sopenharmony_ci        ``malloc()`` with :ref:`debug hooks <pymem-debug-hooks>`.
2417db96d56Sopenharmony_ci      * ``PYMEM_ALLOCATOR_PYMALLOC`` (``5``): :ref:`Python pymalloc memory
2427db96d56Sopenharmony_ci        allocator <pymalloc>`.
2437db96d56Sopenharmony_ci      * ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` (``6``): :ref:`Python pymalloc
2447db96d56Sopenharmony_ci        memory allocator <pymalloc>` with :ref:`debug hooks
2457db96d56Sopenharmony_ci        <pymem-debug-hooks>`.
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci      ``PYMEM_ALLOCATOR_PYMALLOC`` and ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` are
2487db96d56Sopenharmony_ci      not supported if Python is :option:`configured using --without-pymalloc
2497db96d56Sopenharmony_ci      <--without-pymalloc>`.
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci      See :ref:`Memory Management <memory>`.
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci      Default: ``PYMEM_ALLOCATOR_NOT_SET``.
2547db96d56Sopenharmony_ci
2557db96d56Sopenharmony_ci   .. c:member:: int configure_locale
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci      Set the LC_CTYPE locale to the user preferred locale.
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci      If equals to ``0``, set :c:member:`~PyPreConfig.coerce_c_locale` and
2607db96d56Sopenharmony_ci      :c:member:`~PyPreConfig.coerce_c_locale_warn` members to ``0``.
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci      See the :term:`locale encoding`.
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci      Default: ``1`` in Python config, ``0`` in isolated config.
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci   .. c:member:: int coerce_c_locale
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci      If equals to ``2``, coerce the C locale.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci      If equals to ``1``, read the LC_CTYPE locale to decide if it should be
2717db96d56Sopenharmony_ci      coerced.
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci      See the :term:`locale encoding`.
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci      Default: ``-1`` in Python config, ``0`` in isolated config.
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci   .. c:member:: int coerce_c_locale_warn
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci      If non-zero, emit a warning if the C locale is coerced.
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci      Default: ``-1`` in Python config, ``0`` in isolated config.
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   .. c:member:: int dev_mode
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci      :ref:`Python Development Mode <devmode>`: see
2867db96d56Sopenharmony_ci      :c:member:`PyConfig.dev_mode`.
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci      Default: ``-1`` in Python mode, ``0`` in isolated mode.
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci   .. c:member:: int isolated
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci      Isolated mode: see :c:member:`PyConfig.isolated`.
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci      Default: ``0`` in Python mode, ``1`` in isolated mode.
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci   .. c:member:: int legacy_windows_fs_encoding
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci      If non-zero:
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci      * Set :c:member:`PyPreConfig.utf8_mode` to ``0``,
3017db96d56Sopenharmony_ci      * Set :c:member:`PyConfig.filesystem_encoding` to ``"mbcs"``,
3027db96d56Sopenharmony_ci      * Set :c:member:`PyConfig.filesystem_errors` to ``"replace"``.
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci      Initialized the from :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment
3057db96d56Sopenharmony_ci      variable value.
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci      Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for
3087db96d56Sopenharmony_ci      Windows specific code.
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci      Default: ``0``.
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci   .. c:member:: int parse_argv
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci      If non-zero, :c:func:`Py_PreInitializeFromArgs` and
3157db96d56Sopenharmony_ci      :c:func:`Py_PreInitializeFromBytesArgs` parse their ``argv`` argument the
3167db96d56Sopenharmony_ci      same way the regular Python parses command line arguments: see
3177db96d56Sopenharmony_ci      :ref:`Command Line Arguments <using-on-cmdline>`.
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci      Default: ``1`` in Python config, ``0`` in isolated config.
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci   .. c:member:: int use_environment
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci      Use :ref:`environment variables <using-on-envvars>`? See
3247db96d56Sopenharmony_ci      :c:member:`PyConfig.use_environment`.
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci      Default: ``1`` in Python config and ``0`` in isolated config.
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci   .. c:member:: int utf8_mode
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci      If non-zero, enable the :ref:`Python UTF-8 Mode <utf8-mode>`.
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci      Set to ``0`` or ``1`` by the :option:`-X utf8 <-X>` command line option
3337db96d56Sopenharmony_ci      and the :envvar:`PYTHONUTF8` environment variable.
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci      Also set to ``1`` if the ``LC_CTYPE`` locale is ``C`` or ``POSIX``.
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci      Default: ``-1`` in Python config and ``0`` in isolated config.
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci.. _c-preinit:
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ciPreinitialize Python with PyPreConfig
3437db96d56Sopenharmony_ci=====================================
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ciThe preinitialization of Python:
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci* Set the Python memory allocators (:c:member:`PyPreConfig.allocator`)
3487db96d56Sopenharmony_ci* Configure the LC_CTYPE locale (:term:`locale encoding`)
3497db96d56Sopenharmony_ci* Set the :ref:`Python UTF-8 Mode <utf8-mode>`
3507db96d56Sopenharmony_ci  (:c:member:`PyPreConfig.utf8_mode`)
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ciThe current preconfiguration (``PyPreConfig`` type) is stored in
3537db96d56Sopenharmony_ci``_PyRuntime.preconfig``.
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ciFunctions to preinitialize Python:
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci.. c:function:: PyStatus Py_PreInitialize(const PyPreConfig *preconfig)
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci   Preinitialize Python from *preconfig* preconfiguration.
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci   *preconfig* must not be ``NULL``.
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci.. c:function:: PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv)
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci   Preinitialize Python from *preconfig* preconfiguration.
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci   Parse *argv* command line arguments (bytes strings) if
3687db96d56Sopenharmony_ci   :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero.
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ci   *preconfig* must not be ``NULL``.
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci.. c:function:: PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv)
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci   Preinitialize Python from *preconfig* preconfiguration.
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci   Parse *argv* command line arguments (wide strings) if
3777db96d56Sopenharmony_ci   :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero.
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci   *preconfig* must not be ``NULL``.
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ciThe caller is responsible to handle exceptions (error or exit) using
3827db96d56Sopenharmony_ci:c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`.
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ciFor :ref:`Python Configuration <init-python-config>`
3857db96d56Sopenharmony_ci(:c:func:`PyPreConfig_InitPythonConfig`), if Python is initialized with
3867db96d56Sopenharmony_cicommand line arguments, the command line arguments must also be passed to
3877db96d56Sopenharmony_cipreinitialize Python, since they have an effect on the pre-configuration
3887db96d56Sopenharmony_cilike encodings. For example, the :option:`-X utf8 <-X>` command line option
3897db96d56Sopenharmony_cienables the :ref:`Python UTF-8 Mode <utf8-mode>`.
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ci``PyMem_SetAllocator()`` can be called after :c:func:`Py_PreInitialize` and
3927db96d56Sopenharmony_cibefore :c:func:`Py_InitializeFromConfig` to install a custom memory allocator.
3937db96d56Sopenharmony_ciIt can be called before :c:func:`Py_PreInitialize` if
3947db96d56Sopenharmony_ci:c:member:`PyPreConfig.allocator` is set to ``PYMEM_ALLOCATOR_NOT_SET``.
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ciPython memory allocation functions like :c:func:`PyMem_RawMalloc` must not be
3977db96d56Sopenharmony_ciused before the Python preinitialization, whereas calling directly ``malloc()``
3987db96d56Sopenharmony_ciand ``free()`` is always safe. :c:func:`Py_DecodeLocale` must not be called
3997db96d56Sopenharmony_cibefore the Python preinitialization.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ciExample using the preinitialization to enable
4027db96d56Sopenharmony_cithe :ref:`Python UTF-8 Mode <utf8-mode>`::
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci    PyStatus status;
4057db96d56Sopenharmony_ci    PyPreConfig preconfig;
4067db96d56Sopenharmony_ci    PyPreConfig_InitPythonConfig(&preconfig);
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci    preconfig.utf8_mode = 1;
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci    status = Py_PreInitialize(&preconfig);
4117db96d56Sopenharmony_ci    if (PyStatus_Exception(status)) {
4127db96d56Sopenharmony_ci        Py_ExitStatusException(status);
4137db96d56Sopenharmony_ci    }
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci    /* at this point, Python speaks UTF-8 */
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci    Py_Initialize();
4187db96d56Sopenharmony_ci    /* ... use Python API here ... */
4197db96d56Sopenharmony_ci    Py_Finalize();
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ciPyConfig
4237db96d56Sopenharmony_ci========
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci.. c:type:: PyConfig
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci   Structure containing most parameters to configure Python.
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci   When done, the :c:func:`PyConfig_Clear` function must be used to release the
4307db96d56Sopenharmony_ci   configuration memory.
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci   Structure methods:
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci   .. c:function:: void PyConfig_InitPythonConfig(PyConfig *config)
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci      Initialize configuration with the :ref:`Python Configuration
4377db96d56Sopenharmony_ci      <init-python-config>`.
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci   .. c:function:: void PyConfig_InitIsolatedConfig(PyConfig *config)
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci      Initialize configuration with the :ref:`Isolated Configuration
4427db96d56Sopenharmony_ci      <init-isolated-conf>`.
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci   .. c:function:: PyStatus PyConfig_SetString(PyConfig *config, wchar_t * const *config_str, const wchar_t *str)
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci      Copy the wide character string *str* into ``*config_str``.
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci      :ref:`Preinitialize Python <c-preinit>` if needed.
4497db96d56Sopenharmony_ci
4507db96d56Sopenharmony_ci   .. c:function:: PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t * const *config_str, const char *str)
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci      Decode *str* using :c:func:`Py_DecodeLocale` and set the result into
4537db96d56Sopenharmony_ci      ``*config_str``.
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci      :ref:`Preinitialize Python <c-preinit>` if needed.
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci   .. c:function:: PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t * const *argv)
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci      Set command line arguments (:c:member:`~PyConfig.argv` member of
4607db96d56Sopenharmony_ci      *config*) from the *argv* list of wide character strings.
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci      :ref:`Preinitialize Python <c-preinit>` if needed.
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ci   .. c:function:: PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char * const *argv)
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci      Set command line arguments (:c:member:`~PyConfig.argv` member of
4677db96d56Sopenharmony_ci      *config*) from the *argv* list of bytes strings. Decode bytes using
4687db96d56Sopenharmony_ci      :c:func:`Py_DecodeLocale`.
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci      :ref:`Preinitialize Python <c-preinit>` if needed.
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_ci   .. c:function:: PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci      Set the list of wide strings *list* to *length* and *items*.
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci      :ref:`Preinitialize Python <c-preinit>` if needed.
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci   .. c:function:: PyStatus PyConfig_Read(PyConfig *config)
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci      Read all Python configuration.
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci      Fields which are already initialized are left unchanged.
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci      Fields for :ref:`path configuration <init-path-config>` are no longer
4857db96d56Sopenharmony_ci      calculated or modified when calling this function, as of Python 3.11.
4867db96d56Sopenharmony_ci
4877db96d56Sopenharmony_ci      The :c:func:`PyConfig_Read` function only parses
4887db96d56Sopenharmony_ci      :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv`
4897db96d56Sopenharmony_ci      is set to ``2`` after arguments are parsed. Since Python arguments are
4907db96d56Sopenharmony_ci      strippped from :c:member:`PyConfig.argv`, parsing arguments twice would
4917db96d56Sopenharmony_ci      parse the application options as Python options.
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci      :ref:`Preinitialize Python <c-preinit>` if needed.
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci      .. versionchanged:: 3.10
4967db96d56Sopenharmony_ci         The :c:member:`PyConfig.argv` arguments are now only parsed once,
4977db96d56Sopenharmony_ci         :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are
4987db96d56Sopenharmony_ci         parsed, and arguments are only parsed if
4997db96d56Sopenharmony_ci         :c:member:`PyConfig.parse_argv` equals ``1``.
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci      .. versionchanged:: 3.11
5027db96d56Sopenharmony_ci         :c:func:`PyConfig_Read` no longer calculates all paths, and so fields
5037db96d56Sopenharmony_ci         listed under :ref:`Python Path Configuration <init-path-config>` may
5047db96d56Sopenharmony_ci         no longer be updated until :c:func:`Py_InitializeFromConfig` is
5057db96d56Sopenharmony_ci         called.
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci   .. c:function:: void PyConfig_Clear(PyConfig *config)
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci      Release configuration memory.
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci   Most ``PyConfig`` methods :ref:`preinitialize Python <c-preinit>` if needed.
5127db96d56Sopenharmony_ci   In that case, the Python preinitialization configuration
5137db96d56Sopenharmony_ci   (:c:type:`PyPreConfig`) in based on the :c:type:`PyConfig`. If configuration
5147db96d56Sopenharmony_ci   fields which are in common with :c:type:`PyPreConfig` are tuned, they must
5157db96d56Sopenharmony_ci   be set before calling a :c:type:`PyConfig` method:
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ci   * :c:member:`PyConfig.dev_mode`
5187db96d56Sopenharmony_ci   * :c:member:`PyConfig.isolated`
5197db96d56Sopenharmony_ci   * :c:member:`PyConfig.parse_argv`
5207db96d56Sopenharmony_ci   * :c:member:`PyConfig.use_environment`
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci   Moreover, if :c:func:`PyConfig_SetArgv` or :c:func:`PyConfig_SetBytesArgv`
5237db96d56Sopenharmony_ci   is used, this method must be called before other methods, since the
5247db96d56Sopenharmony_ci   preinitialization configuration depends on command line arguments (if
5257db96d56Sopenharmony_ci   :c:member:`parse_argv` is non-zero).
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci   The caller of these methods is responsible to handle exceptions (error or
5287db96d56Sopenharmony_ci   exit) using ``PyStatus_Exception()`` and ``Py_ExitStatusException()``.
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci   Structure fields:
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci   .. c:member:: PyWideStringList argv
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci      Command line arguments: :data:`sys.argv`.
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci      Set :c:member:`~PyConfig.parse_argv` to ``1`` to parse
5377db96d56Sopenharmony_ci      :c:member:`~PyConfig.argv` the same way the regular Python parses Python
5387db96d56Sopenharmony_ci      command line arguments and then to strip Python arguments from
5397db96d56Sopenharmony_ci      :c:member:`~PyConfig.argv`.
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci      If :c:member:`~PyConfig.argv` is empty, an empty string is added to
5427db96d56Sopenharmony_ci      ensure that :data:`sys.argv` always exists and is never empty.
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci      Default: ``NULL``.
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci      See also the :c:member:`~PyConfig.orig_argv` member.
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci   .. c:member:: int safe_path
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci      If equals to zero, ``Py_RunMain()`` prepends a potentially unsafe path to
5517db96d56Sopenharmony_ci      :data:`sys.path` at startup:
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci      * If :c:member:`argv[0] <PyConfig.argv>` is equal to ``L"-m"``
5547db96d56Sopenharmony_ci        (``python -m module``), prepend the current working directory.
5557db96d56Sopenharmony_ci      * If running a script (``python script.py``), prepend the script's
5567db96d56Sopenharmony_ci        directory.  If it's a symbolic link, resolve symbolic links.
5577db96d56Sopenharmony_ci      * Otherwise (``python -c code`` and ``python``), prepend an empty string,
5587db96d56Sopenharmony_ci        which means the current working directory.
5597db96d56Sopenharmony_ci
5607db96d56Sopenharmony_ci      Set to ``1`` by the :option:`-P` command line option and the
5617db96d56Sopenharmony_ci      :envvar:`PYTHONSAFEPATH` environment variable.
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci      Default: ``0`` in Python config, ``1`` in isolated config.
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ci      .. versionadded:: 3.11
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ci   .. c:member:: wchar_t* base_exec_prefix
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_ci      :data:`sys.base_exec_prefix`.
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci      Default: ``NULL``.
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` output.
5747db96d56Sopenharmony_ci
5757db96d56Sopenharmony_ci   .. c:member:: wchar_t* base_executable
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci      Python base executable: :data:`sys._base_executable`.
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci      Set by the :envvar:`__PYVENV_LAUNCHER__` environment variable.
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci      Set from :c:member:`PyConfig.executable` if ``NULL``.
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci      Default: ``NULL``.
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` output.
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci   .. c:member:: wchar_t* base_prefix
5887db96d56Sopenharmony_ci
5897db96d56Sopenharmony_ci      :data:`sys.base_prefix`.
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ci      Default: ``NULL``.
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` output.
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci   .. c:member:: int buffered_stdio
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ci      If equals to ``0`` and :c:member:`~PyConfig.configure_c_stdio` is non-zero,
5987db96d56Sopenharmony_ci      disable buffering on the C streams stdout and stderr.
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci      Set to ``0`` by the :option:`-u` command line option and the
6017db96d56Sopenharmony_ci      :envvar:`PYTHONUNBUFFERED` environment variable.
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci      stdin is always opened in buffered mode.
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci      Default: ``1``.
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci   .. c:member:: int bytes_warning
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci      If equals to ``1``, issue a warning when comparing :class:`bytes` or
6107db96d56Sopenharmony_ci      :class:`bytearray` with :class:`str`, or comparing :class:`bytes` with
6117db96d56Sopenharmony_ci      :class:`int`.
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci      If equal or greater to ``2``, raise a :exc:`BytesWarning` exception in these
6147db96d56Sopenharmony_ci      cases.
6157db96d56Sopenharmony_ci
6167db96d56Sopenharmony_ci      Incremented by the :option:`-b` command line option.
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_ci      Default: ``0``.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci   .. c:member:: int warn_default_encoding
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ci      If non-zero, emit a :exc:`EncodingWarning` warning when :class:`io.TextIOWrapper`
6237db96d56Sopenharmony_ci      uses its default encoding. See :ref:`io-encoding-warning` for details.
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci      Default: ``0``.
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci      .. versionadded:: 3.10
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci   .. c:member:: int code_debug_ranges
6307db96d56Sopenharmony_ci
6317db96d56Sopenharmony_ci      If equals to ``0``, disables the inclusion of the end line and column
6327db96d56Sopenharmony_ci      mappings in code objects. Also disables traceback printing carets to
6337db96d56Sopenharmony_ci      specific error locations.
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci      Set to ``0`` by the :envvar:`PYTHONNODEBUGRANGES` environment variable
6367db96d56Sopenharmony_ci      and by the :option:`-X no_debug_ranges <-X>` command line option.
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci      Default: ``1``.
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci      .. versionadded:: 3.11
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci   .. c:member:: wchar_t* check_hash_pycs_mode
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci      Control the validation behavior of hash-based ``.pyc`` files:
6457db96d56Sopenharmony_ci      value of the :option:`--check-hash-based-pycs` command line option.
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci      Valid values:
6487db96d56Sopenharmony_ci
6497db96d56Sopenharmony_ci      - ``L"always"``: Hash the source file for invalidation regardless of
6507db96d56Sopenharmony_ci        value of the 'check_source' flag.
6517db96d56Sopenharmony_ci      - ``L"never"``: Assume that hash-based pycs always are valid.
6527db96d56Sopenharmony_ci      - ``L"default"``: The 'check_source' flag in hash-based pycs
6537db96d56Sopenharmony_ci        determines invalidation.
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci      Default: ``L"default"``.
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci      See also :pep:`552` "Deterministic pycs".
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci   .. c:member:: int configure_c_stdio
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci      If non-zero, configure C standard streams:
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci      * On Windows, set the binary mode (``O_BINARY``) on stdin, stdout and
6647db96d56Sopenharmony_ci        stderr.
6657db96d56Sopenharmony_ci      * If :c:member:`~PyConfig.buffered_stdio` equals zero, disable buffering
6667db96d56Sopenharmony_ci        of stdin, stdout and stderr streams.
6677db96d56Sopenharmony_ci      * If :c:member:`~PyConfig.interactive` is non-zero, enable stream
6687db96d56Sopenharmony_ci        buffering on stdin and stdout (only stdout on Windows).
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci      Default: ``1`` in Python config, ``0`` in isolated config.
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci   .. c:member:: int dev_mode
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ci      If non-zero, enable the :ref:`Python Development Mode <devmode>`.
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci      Set to ``1`` by the :option:`-X dev <-X>` option and the
6777db96d56Sopenharmony_ci      :envvar:`PYTHONDEVMODE` environment variable.
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci      Default: ``-1`` in Python mode, ``0`` in isolated mode.
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ci   .. c:member:: int dump_refs
6827db96d56Sopenharmony_ci
6837db96d56Sopenharmony_ci      Dump Python references?
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci      If non-zero, dump all objects which are still alive at exit.
6867db96d56Sopenharmony_ci
6877db96d56Sopenharmony_ci      Set to ``1`` by the :envvar:`PYTHONDUMPREFS` environment variable.
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci      Need a special build of Python with the ``Py_TRACE_REFS`` macro defined:
6907db96d56Sopenharmony_ci      see the :option:`configure --with-trace-refs option <--with-trace-refs>`.
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci      Default: ``0``.
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci   .. c:member:: wchar_t* exec_prefix
6957db96d56Sopenharmony_ci
6967db96d56Sopenharmony_ci      The site-specific directory prefix where the platform-dependent Python
6977db96d56Sopenharmony_ci      files are installed: :data:`sys.exec_prefix`.
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci      Default: ``NULL``.
7007db96d56Sopenharmony_ci
7017db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` output.
7027db96d56Sopenharmony_ci
7037db96d56Sopenharmony_ci   .. c:member:: wchar_t* executable
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci      The absolute path of the executable binary for the Python interpreter:
7067db96d56Sopenharmony_ci      :data:`sys.executable`.
7077db96d56Sopenharmony_ci
7087db96d56Sopenharmony_ci      Default: ``NULL``.
7097db96d56Sopenharmony_ci
7107db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` output.
7117db96d56Sopenharmony_ci
7127db96d56Sopenharmony_ci   .. c:member:: int faulthandler
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci      Enable faulthandler?
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci      If non-zero, call :func:`faulthandler.enable` at startup.
7177db96d56Sopenharmony_ci
7187db96d56Sopenharmony_ci      Set to ``1`` by :option:`-X faulthandler <-X>` and the
7197db96d56Sopenharmony_ci      :envvar:`PYTHONFAULTHANDLER` environment variable.
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci      Default: ``-1`` in Python mode, ``0`` in isolated mode.
7227db96d56Sopenharmony_ci
7237db96d56Sopenharmony_ci   .. c:member:: wchar_t* filesystem_encoding
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci      :term:`Filesystem encoding <filesystem encoding and error handler>`:
7267db96d56Sopenharmony_ci      :func:`sys.getfilesystemencoding`.
7277db96d56Sopenharmony_ci
7287db96d56Sopenharmony_ci      On macOS, Android and VxWorks: use ``"utf-8"`` by default.
7297db96d56Sopenharmony_ci
7307db96d56Sopenharmony_ci      On Windows: use ``"utf-8"`` by default, or ``"mbcs"`` if
7317db96d56Sopenharmony_ci      :c:member:`~PyPreConfig.legacy_windows_fs_encoding` of
7327db96d56Sopenharmony_ci      :c:type:`PyPreConfig` is non-zero.
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_ci      Default encoding on other platforms:
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ci      * ``"utf-8"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero.
7377db96d56Sopenharmony_ci      * ``"ascii"`` if Python detects that ``nl_langinfo(CODESET)`` announces
7387db96d56Sopenharmony_ci        the ASCII encoding, whereas the ``mbstowcs()`` function
7397db96d56Sopenharmony_ci        decodes from a different encoding (usually Latin1).
7407db96d56Sopenharmony_ci      * ``"utf-8"`` if ``nl_langinfo(CODESET)`` returns an empty string.
7417db96d56Sopenharmony_ci      * Otherwise, use the :term:`locale encoding`:
7427db96d56Sopenharmony_ci        ``nl_langinfo(CODESET)`` result.
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_ci      At Python startup, the encoding name is normalized to the Python codec
7457db96d56Sopenharmony_ci      name. For example, ``"ANSI_X3.4-1968"`` is replaced with ``"ascii"``.
7467db96d56Sopenharmony_ci
7477db96d56Sopenharmony_ci      See also the :c:member:`~PyConfig.filesystem_errors` member.
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci   .. c:member:: wchar_t* filesystem_errors
7507db96d56Sopenharmony_ci
7517db96d56Sopenharmony_ci      :term:`Filesystem error handler <filesystem encoding and error handler>`:
7527db96d56Sopenharmony_ci      :func:`sys.getfilesystemencodeerrors`.
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci      On Windows: use ``"surrogatepass"`` by default, or ``"replace"``  if
7557db96d56Sopenharmony_ci      :c:member:`~PyPreConfig.legacy_windows_fs_encoding` of
7567db96d56Sopenharmony_ci      :c:type:`PyPreConfig` is non-zero.
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci      On other platforms: use ``"surrogateescape"`` by default.
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci      Supported error handlers:
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci      * ``"strict"``
7637db96d56Sopenharmony_ci      * ``"surrogateescape"``
7647db96d56Sopenharmony_ci      * ``"surrogatepass"`` (only supported with the UTF-8 encoding)
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci      See also the :c:member:`~PyConfig.filesystem_encoding` member.
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ci   .. c:member:: unsigned long hash_seed
7697db96d56Sopenharmony_ci   .. c:member:: int use_hash_seed
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci      Randomized hash function seed.
7727db96d56Sopenharmony_ci
7737db96d56Sopenharmony_ci      If :c:member:`~PyConfig.use_hash_seed` is zero, a seed is chosen randomly
7747db96d56Sopenharmony_ci      at Python startup, and :c:member:`~PyConfig.hash_seed` is ignored.
7757db96d56Sopenharmony_ci
7767db96d56Sopenharmony_ci      Set by the :envvar:`PYTHONHASHSEED` environment variable.
7777db96d56Sopenharmony_ci
7787db96d56Sopenharmony_ci      Default *use_hash_seed* value: ``-1`` in Python mode, ``0`` in isolated
7797db96d56Sopenharmony_ci      mode.
7807db96d56Sopenharmony_ci
7817db96d56Sopenharmony_ci   .. c:member:: wchar_t* home
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ci      Python home directory.
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci      If :c:func:`Py_SetPythonHome` has been called, use its argument if it is
7867db96d56Sopenharmony_ci      not ``NULL``.
7877db96d56Sopenharmony_ci
7887db96d56Sopenharmony_ci      Set by the :envvar:`PYTHONHOME` environment variable.
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_ci      Default: ``NULL``.
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` input.
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci   .. c:member:: int import_time
7957db96d56Sopenharmony_ci
7967db96d56Sopenharmony_ci      If non-zero, profile import time.
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ci      Set the ``1`` by the :option:`-X importtime <-X>` option and the
7997db96d56Sopenharmony_ci      :envvar:`PYTHONPROFILEIMPORTTIME` environment variable.
8007db96d56Sopenharmony_ci
8017db96d56Sopenharmony_ci      Default: ``0``.
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci   .. c:member:: int inspect
8047db96d56Sopenharmony_ci
8057db96d56Sopenharmony_ci      Enter interactive mode after executing a script or a command.
8067db96d56Sopenharmony_ci
8077db96d56Sopenharmony_ci      If greater than ``0``, enable inspect: when a script is passed as first
8087db96d56Sopenharmony_ci      argument or the -c option is used, enter interactive mode after executing
8097db96d56Sopenharmony_ci      the script or the command, even when :data:`sys.stdin` does not appear to
8107db96d56Sopenharmony_ci      be a terminal.
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ci      Incremented by the :option:`-i` command line option. Set to ``1`` if the
8137db96d56Sopenharmony_ci      :envvar:`PYTHONINSPECT` environment variable is non-empty.
8147db96d56Sopenharmony_ci
8157db96d56Sopenharmony_ci      Default: ``0``.
8167db96d56Sopenharmony_ci
8177db96d56Sopenharmony_ci   .. c:member:: int install_signal_handlers
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci      Install Python signal handlers?
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ci      Default: ``1`` in Python mode, ``0`` in isolated mode.
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci   .. c:member:: int interactive
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci      If greater than ``0``, enable the interactive mode (REPL).
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci      Incremented by the :option:`-i` command line option.
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci      Default: ``0``.
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci   .. c:member:: int isolated
8327db96d56Sopenharmony_ci
8337db96d56Sopenharmony_ci      If greater than ``0``, enable isolated mode:
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci      * Set :c:member:`~PyConfig.safe_path` to ``1``:
8367db96d56Sopenharmony_ci        don't prepend a potentially unsafe path to :data:`sys.path` at Python
8377db96d56Sopenharmony_ci        startup.
8387db96d56Sopenharmony_ci      * Set :c:member:`~PyConfig.use_environment` to ``0``.
8397db96d56Sopenharmony_ci      * Set :c:member:`~PyConfig.user_site_directory` to ``0``: don't add the user
8407db96d56Sopenharmony_ci        site directory to :data:`sys.path`.
8417db96d56Sopenharmony_ci      * Python REPL doesn't import :mod:`readline` nor enable default readline
8427db96d56Sopenharmony_ci        configuration on interactive prompts.
8437db96d56Sopenharmony_ci
8447db96d56Sopenharmony_ci      Set to ``1`` by the :option:`-I` command line option.
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci      Default: ``0`` in Python mode, ``1`` in isolated mode.
8477db96d56Sopenharmony_ci
8487db96d56Sopenharmony_ci      See also :c:member:`PyPreConfig.isolated`.
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci   .. c:member:: int legacy_windows_stdio
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci      If non-zero, use :class:`io.FileIO` instead of
8537db96d56Sopenharmony_ci      :class:`io.WindowsConsoleIO` for :data:`sys.stdin`, :data:`sys.stdout`
8547db96d56Sopenharmony_ci      and :data:`sys.stderr`.
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci      Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSSTDIO` environment
8577db96d56Sopenharmony_ci      variable is set to a non-empty string.
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci      Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for
8607db96d56Sopenharmony_ci      Windows specific code.
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ci      Default: ``0``.
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci      See also the :pep:`528` (Change Windows console encoding to UTF-8).
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci   .. c:member:: int malloc_stats
8677db96d56Sopenharmony_ci
8687db96d56Sopenharmony_ci      If non-zero, dump statistics on :ref:`Python pymalloc memory allocator
8697db96d56Sopenharmony_ci      <pymalloc>` at exit.
8707db96d56Sopenharmony_ci
8717db96d56Sopenharmony_ci      Set to ``1`` by the :envvar:`PYTHONMALLOCSTATS` environment variable.
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_ci      The option is ignored if Python is :option:`configured using
8747db96d56Sopenharmony_ci      the --without-pymalloc option <--without-pymalloc>`.
8757db96d56Sopenharmony_ci
8767db96d56Sopenharmony_ci      Default: ``0``.
8777db96d56Sopenharmony_ci
8787db96d56Sopenharmony_ci   .. c:member:: wchar_t* platlibdir
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci      Platform library directory name: :data:`sys.platlibdir`.
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_ci      Set by the :envvar:`PYTHONPLATLIBDIR` environment variable.
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci      Default: value of the ``PLATLIBDIR`` macro which is set by the
8857db96d56Sopenharmony_ci      :option:`configure --with-platlibdir option <--with-platlibdir>`
8867db96d56Sopenharmony_ci      (default: ``"lib"``, or ``"DLLs"`` on Windows).
8877db96d56Sopenharmony_ci
8887db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` input.
8897db96d56Sopenharmony_ci
8907db96d56Sopenharmony_ci      .. versionadded:: 3.9
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci      .. versionchanged:: 3.11
8937db96d56Sopenharmony_ci         This macro is now used on Windows to locate the standard
8947db96d56Sopenharmony_ci         library extension modules, typically under ``DLLs``. However,
8957db96d56Sopenharmony_ci         for compatibility, note that this value is ignored for any
8967db96d56Sopenharmony_ci         non-standard layouts, including in-tree builds and virtual
8977db96d56Sopenharmony_ci         environments.
8987db96d56Sopenharmony_ci
8997db96d56Sopenharmony_ci   .. c:member:: wchar_t* pythonpath_env
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci      Module search paths (:data:`sys.path`) as a string separated by ``DELIM``
9027db96d56Sopenharmony_ci      (:data:`os.path.pathsep`).
9037db96d56Sopenharmony_ci
9047db96d56Sopenharmony_ci      Set by the :envvar:`PYTHONPATH` environment variable.
9057db96d56Sopenharmony_ci
9067db96d56Sopenharmony_ci      Default: ``NULL``.
9077db96d56Sopenharmony_ci
9087db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` input.
9097db96d56Sopenharmony_ci
9107db96d56Sopenharmony_ci   .. c:member:: PyWideStringList module_search_paths
9117db96d56Sopenharmony_ci   .. c:member:: int module_search_paths_set
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_ci      Module search paths: :data:`sys.path`.
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ci      If :c:member:`~PyConfig.module_search_paths_set` is equal to ``0``,
9167db96d56Sopenharmony_ci      :c:func:`Py_InitializeFromConfig` will replace
9177db96d56Sopenharmony_ci      :c:member:`~PyConfig.module_search_paths` and sets
9187db96d56Sopenharmony_ci      :c:member:`~PyConfig.module_search_paths_set` to ``1``.
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_ci      Default: empty list (``module_search_paths``) and ``0``
9217db96d56Sopenharmony_ci      (``module_search_paths_set``).
9227db96d56Sopenharmony_ci
9237db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` output.
9247db96d56Sopenharmony_ci
9257db96d56Sopenharmony_ci   .. c:member:: int optimization_level
9267db96d56Sopenharmony_ci
9277db96d56Sopenharmony_ci      Compilation optimization level:
9287db96d56Sopenharmony_ci
9297db96d56Sopenharmony_ci      * ``0``: Peephole optimizer, set ``__debug__`` to ``True``.
9307db96d56Sopenharmony_ci      * ``1``: Level 0, remove assertions, set ``__debug__`` to ``False``.
9317db96d56Sopenharmony_ci      * ``2``: Level 1, strip docstrings.
9327db96d56Sopenharmony_ci
9337db96d56Sopenharmony_ci      Incremented by the :option:`-O` command line option. Set to the
9347db96d56Sopenharmony_ci      :envvar:`PYTHONOPTIMIZE` environment variable value.
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci      Default: ``0``.
9377db96d56Sopenharmony_ci
9387db96d56Sopenharmony_ci   .. c:member:: PyWideStringList orig_argv
9397db96d56Sopenharmony_ci
9407db96d56Sopenharmony_ci      The list of the original command line arguments passed to the Python
9417db96d56Sopenharmony_ci      executable: :data:`sys.orig_argv`.
9427db96d56Sopenharmony_ci
9437db96d56Sopenharmony_ci      If :c:member:`~PyConfig.orig_argv` list is empty and
9447db96d56Sopenharmony_ci      :c:member:`~PyConfig.argv` is not a list only containing an empty
9457db96d56Sopenharmony_ci      string, :c:func:`PyConfig_Read` copies :c:member:`~PyConfig.argv` into
9467db96d56Sopenharmony_ci      :c:member:`~PyConfig.orig_argv` before modifying
9477db96d56Sopenharmony_ci      :c:member:`~PyConfig.argv` (if :c:member:`~PyConfig.parse_argv` is
9487db96d56Sopenharmony_ci      non-zero).
9497db96d56Sopenharmony_ci
9507db96d56Sopenharmony_ci      See also the :c:member:`~PyConfig.argv` member and the
9517db96d56Sopenharmony_ci      :c:func:`Py_GetArgcArgv` function.
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_ci      Default: empty list.
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ci      .. versionadded:: 3.10
9567db96d56Sopenharmony_ci
9577db96d56Sopenharmony_ci   .. c:member:: int parse_argv
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci      Parse command line arguments?
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci      If equals to ``1``, parse :c:member:`~PyConfig.argv` the same way the regular
9627db96d56Sopenharmony_ci      Python parses :ref:`command line arguments <using-on-cmdline>`, and strip
9637db96d56Sopenharmony_ci      Python arguments from :c:member:`~PyConfig.argv`.
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci      The :c:func:`PyConfig_Read` function only parses
9667db96d56Sopenharmony_ci      :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv`
9677db96d56Sopenharmony_ci      is set to ``2`` after arguments are parsed. Since Python arguments are
9687db96d56Sopenharmony_ci      strippped from :c:member:`PyConfig.argv`, parsing arguments twice would
9697db96d56Sopenharmony_ci      parse the application options as Python options.
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci      Default: ``1`` in Python mode, ``0`` in isolated mode.
9727db96d56Sopenharmony_ci
9737db96d56Sopenharmony_ci      .. versionchanged:: 3.10
9747db96d56Sopenharmony_ci         The :c:member:`PyConfig.argv` arguments are now only parsed if
9757db96d56Sopenharmony_ci         :c:member:`PyConfig.parse_argv` equals to ``1``.
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ci   .. c:member:: int parser_debug
9787db96d56Sopenharmony_ci
9797db96d56Sopenharmony_ci      Parser debug mode. If greater than ``0``, turn on parser debugging output (for expert only, depending
9807db96d56Sopenharmony_ci      on compilation options).
9817db96d56Sopenharmony_ci
9827db96d56Sopenharmony_ci      Incremented by the :option:`-d` command line option. Set to the
9837db96d56Sopenharmony_ci      :envvar:`PYTHONDEBUG` environment variable value.
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_ci      Default: ``0``.
9867db96d56Sopenharmony_ci
9877db96d56Sopenharmony_ci   .. c:member:: int pathconfig_warnings
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_ci      If non-zero, calculation of path configuration is allowed to log
9907db96d56Sopenharmony_ci      warnings into ``stderr``. If equals to ``0``, suppress these warnings.
9917db96d56Sopenharmony_ci
9927db96d56Sopenharmony_ci      Default: ``1`` in Python mode, ``0`` in isolated mode.
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` input.
9957db96d56Sopenharmony_ci
9967db96d56Sopenharmony_ci      .. versionchanged:: 3.11
9977db96d56Sopenharmony_ci         Now also applies on Windows.
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci   .. c:member:: wchar_t* prefix
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ci      The site-specific directory prefix where the platform independent Python
10027db96d56Sopenharmony_ci      files are installed: :data:`sys.prefix`.
10037db96d56Sopenharmony_ci
10047db96d56Sopenharmony_ci      Default: ``NULL``.
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` output.
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ci   .. c:member:: wchar_t* program_name
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_ci      Program name used to initialize :c:member:`~PyConfig.executable` and in
10117db96d56Sopenharmony_ci      early error messages during Python initialization.
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ci      * If :func:`Py_SetProgramName` has been called, use its argument.
10147db96d56Sopenharmony_ci      * On macOS, use :envvar:`PYTHONEXECUTABLE` environment variable if set.
10157db96d56Sopenharmony_ci      * If the ``WITH_NEXT_FRAMEWORK`` macro is defined, use
10167db96d56Sopenharmony_ci        :envvar:`__PYVENV_LAUNCHER__` environment variable if set.
10177db96d56Sopenharmony_ci      * Use ``argv[0]`` of :c:member:`~PyConfig.argv` if available and
10187db96d56Sopenharmony_ci        non-empty.
10197db96d56Sopenharmony_ci      * Otherwise, use ``L"python"`` on Windows, or ``L"python3"`` on other
10207db96d56Sopenharmony_ci        platforms.
10217db96d56Sopenharmony_ci
10227db96d56Sopenharmony_ci      Default: ``NULL``.
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ci      Part of the :ref:`Python Path Configuration <init-path-config>` input.
10257db96d56Sopenharmony_ci
10267db96d56Sopenharmony_ci   .. c:member:: wchar_t* pycache_prefix
10277db96d56Sopenharmony_ci
10287db96d56Sopenharmony_ci      Directory where cached ``.pyc`` files are written:
10297db96d56Sopenharmony_ci      :data:`sys.pycache_prefix`.
10307db96d56Sopenharmony_ci
10317db96d56Sopenharmony_ci      Set by the :option:`-X pycache_prefix=PATH <-X>` command line option and
10327db96d56Sopenharmony_ci      the :envvar:`PYTHONPYCACHEPREFIX` environment variable.
10337db96d56Sopenharmony_ci
10347db96d56Sopenharmony_ci      If ``NULL``, :data:`sys.pycache_prefix` is set to ``None``.
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ci      Default: ``NULL``.
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_ci   .. c:member:: int quiet
10397db96d56Sopenharmony_ci
10407db96d56Sopenharmony_ci      Quiet mode. If greater than ``0``, don't display the copyright and version at
10417db96d56Sopenharmony_ci      Python startup in interactive mode.
10427db96d56Sopenharmony_ci
10437db96d56Sopenharmony_ci      Incremented by the :option:`-q` command line option.
10447db96d56Sopenharmony_ci
10457db96d56Sopenharmony_ci      Default: ``0``.
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci   .. c:member:: wchar_t* run_command
10487db96d56Sopenharmony_ci
10497db96d56Sopenharmony_ci      Value of the :option:`-c` command line option.
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci      Used by :c:func:`Py_RunMain`.
10527db96d56Sopenharmony_ci
10537db96d56Sopenharmony_ci      Default: ``NULL``.
10547db96d56Sopenharmony_ci
10557db96d56Sopenharmony_ci   .. c:member:: wchar_t* run_filename
10567db96d56Sopenharmony_ci
10577db96d56Sopenharmony_ci      Filename passed on the command line: trailing command line argument
10587db96d56Sopenharmony_ci      without :option:`-c` or :option:`-m`. It is used by the
10597db96d56Sopenharmony_ci      :c:func:`Py_RunMain` function.
10607db96d56Sopenharmony_ci
10617db96d56Sopenharmony_ci      For example, it is set to ``script.py`` by the ``python3 script.py arg``
10627db96d56Sopenharmony_ci      command line.
10637db96d56Sopenharmony_ci
10647db96d56Sopenharmony_ci      See also the :c:member:`PyConfig.skip_source_first_line` option.
10657db96d56Sopenharmony_ci
10667db96d56Sopenharmony_ci      Default: ``NULL``.
10677db96d56Sopenharmony_ci
10687db96d56Sopenharmony_ci   .. c:member:: wchar_t* run_module
10697db96d56Sopenharmony_ci
10707db96d56Sopenharmony_ci      Value of the :option:`-m` command line option.
10717db96d56Sopenharmony_ci
10727db96d56Sopenharmony_ci      Used by :c:func:`Py_RunMain`.
10737db96d56Sopenharmony_ci
10747db96d56Sopenharmony_ci      Default: ``NULL``.
10757db96d56Sopenharmony_ci
10767db96d56Sopenharmony_ci   .. c:member:: int show_ref_count
10777db96d56Sopenharmony_ci
10787db96d56Sopenharmony_ci      Show total reference count at exit?
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ci      Set to ``1`` by :option:`-X showrefcount <-X>` command line option.
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci      Need a :ref:`debug build of Python <debug-build>` (the ``Py_REF_DEBUG``
10837db96d56Sopenharmony_ci      macro must be defined).
10847db96d56Sopenharmony_ci
10857db96d56Sopenharmony_ci      Default: ``0``.
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci   .. c:member:: int site_import
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci      Import the :mod:`site` module at startup?
10907db96d56Sopenharmony_ci
10917db96d56Sopenharmony_ci      If equal to zero, disable the import of the module site and the
10927db96d56Sopenharmony_ci      site-dependent manipulations of :data:`sys.path` that it entails.
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci      Also disable these manipulations if the :mod:`site` module is explicitly
10957db96d56Sopenharmony_ci      imported later (call :func:`site.main` if you want them to be triggered).
10967db96d56Sopenharmony_ci
10977db96d56Sopenharmony_ci      Set to ``0`` by the :option:`-S` command line option.
10987db96d56Sopenharmony_ci
10997db96d56Sopenharmony_ci      :data:`sys.flags.no_site` is set to the inverted value of
11007db96d56Sopenharmony_ci      :c:member:`~PyConfig.site_import`.
11017db96d56Sopenharmony_ci
11027db96d56Sopenharmony_ci      Default: ``1``.
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ci   .. c:member:: int skip_source_first_line
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ci      If non-zero, skip the first line of the :c:member:`PyConfig.run_filename`
11077db96d56Sopenharmony_ci      source.
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci      It allows the usage of non-Unix forms of ``#!cmd``. This is intended for
11107db96d56Sopenharmony_ci      a DOS specific hack only.
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci      Set to ``1`` by the :option:`-x` command line option.
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci      Default: ``0``.
11157db96d56Sopenharmony_ci
11167db96d56Sopenharmony_ci   .. c:member:: wchar_t* stdio_encoding
11177db96d56Sopenharmony_ci   .. c:member:: wchar_t* stdio_errors
11187db96d56Sopenharmony_ci
11197db96d56Sopenharmony_ci      Encoding and encoding errors of :data:`sys.stdin`, :data:`sys.stdout` and
11207db96d56Sopenharmony_ci      :data:`sys.stderr` (but :data:`sys.stderr` always uses
11217db96d56Sopenharmony_ci      ``"backslashreplace"`` error handler).
11227db96d56Sopenharmony_ci
11237db96d56Sopenharmony_ci      If :c:func:`Py_SetStandardStreamEncoding` has been called, use its
11247db96d56Sopenharmony_ci      *error* and *errors* arguments if they are not ``NULL``.
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ci      Use the :envvar:`PYTHONIOENCODING` environment variable if it is
11277db96d56Sopenharmony_ci      non-empty.
11287db96d56Sopenharmony_ci
11297db96d56Sopenharmony_ci      Default encoding:
11307db96d56Sopenharmony_ci
11317db96d56Sopenharmony_ci      * ``"UTF-8"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero.
11327db96d56Sopenharmony_ci      * Otherwise, use the :term:`locale encoding`.
11337db96d56Sopenharmony_ci
11347db96d56Sopenharmony_ci      Default error handler:
11357db96d56Sopenharmony_ci
11367db96d56Sopenharmony_ci      * On Windows: use ``"surrogateescape"``.
11377db96d56Sopenharmony_ci      * ``"surrogateescape"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero,
11387db96d56Sopenharmony_ci        or if the LC_CTYPE locale is "C" or "POSIX".
11397db96d56Sopenharmony_ci      * ``"strict"`` otherwise.
11407db96d56Sopenharmony_ci
11417db96d56Sopenharmony_ci   .. c:member:: int tracemalloc
11427db96d56Sopenharmony_ci
11437db96d56Sopenharmony_ci      Enable tracemalloc?
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci      If non-zero, call :func:`tracemalloc.start` at startup.
11467db96d56Sopenharmony_ci
11477db96d56Sopenharmony_ci      Set by :option:`-X tracemalloc=N <-X>` command line option and by the
11487db96d56Sopenharmony_ci      :envvar:`PYTHONTRACEMALLOC` environment variable.
11497db96d56Sopenharmony_ci
11507db96d56Sopenharmony_ci      Default: ``-1`` in Python mode, ``0`` in isolated mode.
11517db96d56Sopenharmony_ci
11527db96d56Sopenharmony_ci   .. c:member:: int use_environment
11537db96d56Sopenharmony_ci
11547db96d56Sopenharmony_ci      Use :ref:`environment variables <using-on-envvars>`?
11557db96d56Sopenharmony_ci
11567db96d56Sopenharmony_ci      If equals to zero, ignore the :ref:`environment variables
11577db96d56Sopenharmony_ci      <using-on-envvars>`.
11587db96d56Sopenharmony_ci
11597db96d56Sopenharmony_ci      Set to ``0`` by the :option:`-E` environment variable.
11607db96d56Sopenharmony_ci
11617db96d56Sopenharmony_ci      Default: ``1`` in Python config and ``0`` in isolated config.
11627db96d56Sopenharmony_ci
11637db96d56Sopenharmony_ci   .. c:member:: int user_site_directory
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci      If non-zero, add the user site directory to :data:`sys.path`.
11667db96d56Sopenharmony_ci
11677db96d56Sopenharmony_ci      Set to ``0`` by the :option:`-s` and :option:`-I` command line options.
11687db96d56Sopenharmony_ci
11697db96d56Sopenharmony_ci      Set to ``0`` by the :envvar:`PYTHONNOUSERSITE` environment variable.
11707db96d56Sopenharmony_ci
11717db96d56Sopenharmony_ci      Default: ``1`` in Python mode, ``0`` in isolated mode.
11727db96d56Sopenharmony_ci
11737db96d56Sopenharmony_ci   .. c:member:: int verbose
11747db96d56Sopenharmony_ci
11757db96d56Sopenharmony_ci      Verbose mode. If greater than ``0``, print a message each time a module is
11767db96d56Sopenharmony_ci      imported, showing the place (filename or built-in module) from which
11777db96d56Sopenharmony_ci      it is loaded.
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ci      If greater or equal to ``2``, print a message for each file that is checked
11807db96d56Sopenharmony_ci      for when searching for a module. Also provides information on module
11817db96d56Sopenharmony_ci      cleanup at exit.
11827db96d56Sopenharmony_ci
11837db96d56Sopenharmony_ci      Incremented by the :option:`-v` command line option.
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_ci      Set to the :envvar:`PYTHONVERBOSE` environment variable value.
11867db96d56Sopenharmony_ci
11877db96d56Sopenharmony_ci      Default: ``0``.
11887db96d56Sopenharmony_ci
11897db96d56Sopenharmony_ci   .. c:member:: PyWideStringList warnoptions
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_ci      Options of the :mod:`warnings` module to build warnings filters, lowest
11927db96d56Sopenharmony_ci      to highest priority: :data:`sys.warnoptions`.
11937db96d56Sopenharmony_ci
11947db96d56Sopenharmony_ci      The :mod:`warnings` module adds :data:`sys.warnoptions` in the reverse
11957db96d56Sopenharmony_ci      order: the last :c:member:`PyConfig.warnoptions` item becomes the first
11967db96d56Sopenharmony_ci      item of :data:`warnings.filters` which is checked first (highest
11977db96d56Sopenharmony_ci      priority).
11987db96d56Sopenharmony_ci
11997db96d56Sopenharmony_ci      The :option:`-W` command line options adds its value to
12007db96d56Sopenharmony_ci      :c:member:`~PyConfig.warnoptions`, it can be used multiple times.
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci      The :envvar:`PYTHONWARNINGS` environment variable can also be used to add
12037db96d56Sopenharmony_ci      warning options. Multiple options can be specified, separated by commas
12047db96d56Sopenharmony_ci      (``,``).
12057db96d56Sopenharmony_ci
12067db96d56Sopenharmony_ci      Default: empty list.
12077db96d56Sopenharmony_ci
12087db96d56Sopenharmony_ci   .. c:member:: int write_bytecode
12097db96d56Sopenharmony_ci
12107db96d56Sopenharmony_ci      If equal to ``0``, Python won't try to write ``.pyc`` files on the import of
12117db96d56Sopenharmony_ci      source modules.
12127db96d56Sopenharmony_ci
12137db96d56Sopenharmony_ci      Set to ``0`` by the :option:`-B` command line option and the
12147db96d56Sopenharmony_ci      :envvar:`PYTHONDONTWRITEBYTECODE` environment variable.
12157db96d56Sopenharmony_ci
12167db96d56Sopenharmony_ci      :data:`sys.dont_write_bytecode` is initialized to the inverted value of
12177db96d56Sopenharmony_ci      :c:member:`~PyConfig.write_bytecode`.
12187db96d56Sopenharmony_ci
12197db96d56Sopenharmony_ci      Default: ``1``.
12207db96d56Sopenharmony_ci
12217db96d56Sopenharmony_ci   .. c:member:: PyWideStringList xoptions
12227db96d56Sopenharmony_ci
12237db96d56Sopenharmony_ci      Values of the :option:`-X` command line options: :data:`sys._xoptions`.
12247db96d56Sopenharmony_ci
12257db96d56Sopenharmony_ci      Default: empty list.
12267db96d56Sopenharmony_ci
12277db96d56Sopenharmony_ciIf :c:member:`~PyConfig.parse_argv` is non-zero, :c:member:`~PyConfig.argv`
12287db96d56Sopenharmony_ciarguments are parsed the same way the regular Python parses :ref:`command line
12297db96d56Sopenharmony_ciarguments <using-on-cmdline>`, and Python arguments are stripped from
12307db96d56Sopenharmony_ci:c:member:`~PyConfig.argv`.
12317db96d56Sopenharmony_ci
12327db96d56Sopenharmony_ciThe :c:member:`~PyConfig.xoptions` options are parsed to set other options: see
12337db96d56Sopenharmony_cithe :option:`-X` command line option.
12347db96d56Sopenharmony_ci
12357db96d56Sopenharmony_ci.. versionchanged:: 3.9
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ci   The ``show_alloc_count`` field has been removed.
12387db96d56Sopenharmony_ci
12397db96d56Sopenharmony_ci
12407db96d56Sopenharmony_ciInitialization with PyConfig
12417db96d56Sopenharmony_ci============================
12427db96d56Sopenharmony_ci
12437db96d56Sopenharmony_ciFunction to initialize Python:
12447db96d56Sopenharmony_ci
12457db96d56Sopenharmony_ci.. c:function:: PyStatus Py_InitializeFromConfig(const PyConfig *config)
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci   Initialize Python from *config* configuration.
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ciThe caller is responsible to handle exceptions (error or exit) using
12507db96d56Sopenharmony_ci:c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`.
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ciIf :c:func:`PyImport_FrozenModules`, :c:func:`PyImport_AppendInittab` or
12537db96d56Sopenharmony_ci:c:func:`PyImport_ExtendInittab` are used, they must be set or called after
12547db96d56Sopenharmony_ciPython preinitialization and before the Python initialization. If Python is
12557db96d56Sopenharmony_ciinitialized multiple times, :c:func:`PyImport_AppendInittab` or
12567db96d56Sopenharmony_ci:c:func:`PyImport_ExtendInittab` must be called before each Python
12577db96d56Sopenharmony_ciinitialization.
12587db96d56Sopenharmony_ci
12597db96d56Sopenharmony_ciThe current configuration (``PyConfig`` type) is stored in
12607db96d56Sopenharmony_ci``PyInterpreterState.config``.
12617db96d56Sopenharmony_ci
12627db96d56Sopenharmony_ciExample setting the program name::
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci    void init_python(void)
12657db96d56Sopenharmony_ci    {
12667db96d56Sopenharmony_ci        PyStatus status;
12677db96d56Sopenharmony_ci
12687db96d56Sopenharmony_ci        PyConfig config;
12697db96d56Sopenharmony_ci        PyConfig_InitPythonConfig(&config);
12707db96d56Sopenharmony_ci
12717db96d56Sopenharmony_ci        /* Set the program name. Implicitly preinitialize Python. */
12727db96d56Sopenharmony_ci        status = PyConfig_SetString(&config, &config.program_name,
12737db96d56Sopenharmony_ci                                    L"/path/to/my_program");
12747db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
12757db96d56Sopenharmony_ci            goto exception;
12767db96d56Sopenharmony_ci        }
12777db96d56Sopenharmony_ci
12787db96d56Sopenharmony_ci        status = Py_InitializeFromConfig(&config);
12797db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
12807db96d56Sopenharmony_ci            goto exception;
12817db96d56Sopenharmony_ci        }
12827db96d56Sopenharmony_ci        PyConfig_Clear(&config);
12837db96d56Sopenharmony_ci        return;
12847db96d56Sopenharmony_ci
12857db96d56Sopenharmony_ci    exception:
12867db96d56Sopenharmony_ci        PyConfig_Clear(&config);
12877db96d56Sopenharmony_ci        Py_ExitStatusException(status);
12887db96d56Sopenharmony_ci    }
12897db96d56Sopenharmony_ci
12907db96d56Sopenharmony_ciMore complete example modifying the default configuration, read the
12917db96d56Sopenharmony_ciconfiguration, and then override some parameters. Note that since
12927db96d56Sopenharmony_ci3.11, many parameters are not calculated until initialization, and
12937db96d56Sopenharmony_ciso values cannot be read from the configuration structure. Any values
12947db96d56Sopenharmony_ciset before initialize is called will be left unchanged by
12957db96d56Sopenharmony_ciinitialization::
12967db96d56Sopenharmony_ci
12977db96d56Sopenharmony_ci    PyStatus init_python(const char *program_name)
12987db96d56Sopenharmony_ci    {
12997db96d56Sopenharmony_ci        PyStatus status;
13007db96d56Sopenharmony_ci
13017db96d56Sopenharmony_ci        PyConfig config;
13027db96d56Sopenharmony_ci        PyConfig_InitPythonConfig(&config);
13037db96d56Sopenharmony_ci
13047db96d56Sopenharmony_ci        /* Set the program name before reading the configuration
13057db96d56Sopenharmony_ci           (decode byte string from the locale encoding).
13067db96d56Sopenharmony_ci
13077db96d56Sopenharmony_ci           Implicitly preinitialize Python. */
13087db96d56Sopenharmony_ci        status = PyConfig_SetBytesString(&config, &config.program_name,
13097db96d56Sopenharmony_ci                                         program_name);
13107db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
13117db96d56Sopenharmony_ci            goto done;
13127db96d56Sopenharmony_ci        }
13137db96d56Sopenharmony_ci
13147db96d56Sopenharmony_ci        /* Read all configuration at once */
13157db96d56Sopenharmony_ci        status = PyConfig_Read(&config);
13167db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
13177db96d56Sopenharmony_ci            goto done;
13187db96d56Sopenharmony_ci        }
13197db96d56Sopenharmony_ci
13207db96d56Sopenharmony_ci        /* Specify sys.path explicitly */
13217db96d56Sopenharmony_ci        /* If you want to modify the default set of paths, finish
13227db96d56Sopenharmony_ci           initialization first and then use PySys_GetObject("path") */
13237db96d56Sopenharmony_ci        config.module_search_paths_set = 1;
13247db96d56Sopenharmony_ci        status = PyWideStringList_Append(&config.module_search_paths,
13257db96d56Sopenharmony_ci                                         L"/path/to/stdlib");
13267db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
13277db96d56Sopenharmony_ci            goto done;
13287db96d56Sopenharmony_ci        }
13297db96d56Sopenharmony_ci        status = PyWideStringList_Append(&config.module_search_paths,
13307db96d56Sopenharmony_ci                                         L"/path/to/more/modules");
13317db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
13327db96d56Sopenharmony_ci            goto done;
13337db96d56Sopenharmony_ci        }
13347db96d56Sopenharmony_ci
13357db96d56Sopenharmony_ci        /* Override executable computed by PyConfig_Read() */
13367db96d56Sopenharmony_ci        status = PyConfig_SetString(&config, &config.executable,
13377db96d56Sopenharmony_ci                                    L"/path/to/my_executable");
13387db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
13397db96d56Sopenharmony_ci            goto done;
13407db96d56Sopenharmony_ci        }
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci        status = Py_InitializeFromConfig(&config);
13437db96d56Sopenharmony_ci
13447db96d56Sopenharmony_ci    done:
13457db96d56Sopenharmony_ci        PyConfig_Clear(&config);
13467db96d56Sopenharmony_ci        return status;
13477db96d56Sopenharmony_ci    }
13487db96d56Sopenharmony_ci
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_ci.. _init-isolated-conf:
13517db96d56Sopenharmony_ci
13527db96d56Sopenharmony_ciIsolated Configuration
13537db96d56Sopenharmony_ci======================
13547db96d56Sopenharmony_ci
13557db96d56Sopenharmony_ci:c:func:`PyPreConfig_InitIsolatedConfig` and
13567db96d56Sopenharmony_ci:c:func:`PyConfig_InitIsolatedConfig` functions create a configuration to
13577db96d56Sopenharmony_ciisolate Python from the system. For example, to embed Python into an
13587db96d56Sopenharmony_ciapplication.
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ciThis configuration ignores global configuration variables, environment
13617db96d56Sopenharmony_civariables, command line arguments (:c:member:`PyConfig.argv` is not parsed)
13627db96d56Sopenharmony_ciand user site directory. The C standard streams (ex: ``stdout``) and the
13637db96d56Sopenharmony_ciLC_CTYPE locale are left unchanged. Signal handlers are not installed.
13647db96d56Sopenharmony_ci
13657db96d56Sopenharmony_ciConfiguration files are still used with this configuration to determine
13667db96d56Sopenharmony_cipaths that are unspecified. Ensure :c:member:`PyConfig.home` is specified
13677db96d56Sopenharmony_cito avoid computing the default path configuration.
13687db96d56Sopenharmony_ci
13697db96d56Sopenharmony_ci
13707db96d56Sopenharmony_ci.. _init-python-config:
13717db96d56Sopenharmony_ci
13727db96d56Sopenharmony_ciPython Configuration
13737db96d56Sopenharmony_ci====================
13747db96d56Sopenharmony_ci
13757db96d56Sopenharmony_ci:c:func:`PyPreConfig_InitPythonConfig` and :c:func:`PyConfig_InitPythonConfig`
13767db96d56Sopenharmony_cifunctions create a configuration to build a customized Python which behaves as
13777db96d56Sopenharmony_cithe regular Python.
13787db96d56Sopenharmony_ci
13797db96d56Sopenharmony_ciEnvironments variables and command line arguments are used to configure
13807db96d56Sopenharmony_ciPython, whereas global configuration variables are ignored.
13817db96d56Sopenharmony_ci
13827db96d56Sopenharmony_ciThis function enables C locale coercion (:pep:`538`)
13837db96d56Sopenharmony_ciand :ref:`Python UTF-8 Mode <utf8-mode>`
13847db96d56Sopenharmony_ci(:pep:`540`) depending on the LC_CTYPE locale, :envvar:`PYTHONUTF8` and
13857db96d56Sopenharmony_ci:envvar:`PYTHONCOERCECLOCALE` environment variables.
13867db96d56Sopenharmony_ci
13877db96d56Sopenharmony_ci
13887db96d56Sopenharmony_ci.. _init-path-config:
13897db96d56Sopenharmony_ci
13907db96d56Sopenharmony_ciPython Path Configuration
13917db96d56Sopenharmony_ci=========================
13927db96d56Sopenharmony_ci
13937db96d56Sopenharmony_ci:c:type:`PyConfig` contains multiple fields for the path configuration:
13947db96d56Sopenharmony_ci
13957db96d56Sopenharmony_ci* Path configuration inputs:
13967db96d56Sopenharmony_ci
13977db96d56Sopenharmony_ci  * :c:member:`PyConfig.home`
13987db96d56Sopenharmony_ci  * :c:member:`PyConfig.platlibdir`
13997db96d56Sopenharmony_ci  * :c:member:`PyConfig.pathconfig_warnings`
14007db96d56Sopenharmony_ci  * :c:member:`PyConfig.program_name`
14017db96d56Sopenharmony_ci  * :c:member:`PyConfig.pythonpath_env`
14027db96d56Sopenharmony_ci  * current working directory: to get absolute paths
14037db96d56Sopenharmony_ci  * ``PATH`` environment variable to get the program full path
14047db96d56Sopenharmony_ci    (from :c:member:`PyConfig.program_name`)
14057db96d56Sopenharmony_ci  * ``__PYVENV_LAUNCHER__`` environment variable
14067db96d56Sopenharmony_ci  * (Windows only) Application paths in the registry under
14077db96d56Sopenharmony_ci    "Software\Python\PythonCore\X.Y\PythonPath" of HKEY_CURRENT_USER and
14087db96d56Sopenharmony_ci    HKEY_LOCAL_MACHINE (where X.Y is the Python version).
14097db96d56Sopenharmony_ci
14107db96d56Sopenharmony_ci* Path configuration output fields:
14117db96d56Sopenharmony_ci
14127db96d56Sopenharmony_ci  * :c:member:`PyConfig.base_exec_prefix`
14137db96d56Sopenharmony_ci  * :c:member:`PyConfig.base_executable`
14147db96d56Sopenharmony_ci  * :c:member:`PyConfig.base_prefix`
14157db96d56Sopenharmony_ci  * :c:member:`PyConfig.exec_prefix`
14167db96d56Sopenharmony_ci  * :c:member:`PyConfig.executable`
14177db96d56Sopenharmony_ci  * :c:member:`PyConfig.module_search_paths_set`,
14187db96d56Sopenharmony_ci    :c:member:`PyConfig.module_search_paths`
14197db96d56Sopenharmony_ci  * :c:member:`PyConfig.prefix`
14207db96d56Sopenharmony_ci
14217db96d56Sopenharmony_ciIf at least one "output field" is not set, Python calculates the path
14227db96d56Sopenharmony_ciconfiguration to fill unset fields. If
14237db96d56Sopenharmony_ci:c:member:`~PyConfig.module_search_paths_set` is equal to ``0``,
14247db96d56Sopenharmony_ci:c:member:`~PyConfig.module_search_paths` is overridden and
14257db96d56Sopenharmony_ci:c:member:`~PyConfig.module_search_paths_set` is set to ``1``.
14267db96d56Sopenharmony_ci
14277db96d56Sopenharmony_ciIt is possible to completely ignore the function calculating the default
14287db96d56Sopenharmony_cipath configuration by setting explicitly all path configuration output
14297db96d56Sopenharmony_cifields listed above. A string is considered as set even if it is non-empty.
14307db96d56Sopenharmony_ci``module_search_paths`` is considered as set if
14317db96d56Sopenharmony_ci``module_search_paths_set`` is set to ``1``. In this case,
14327db96d56Sopenharmony_ci``module_search_paths`` will be used without modification.
14337db96d56Sopenharmony_ci
14347db96d56Sopenharmony_ciSet :c:member:`~PyConfig.pathconfig_warnings` to ``0`` to suppress warnings when
14357db96d56Sopenharmony_cicalculating the path configuration (Unix only, Windows does not log any warning).
14367db96d56Sopenharmony_ci
14377db96d56Sopenharmony_ciIf :c:member:`~PyConfig.base_prefix` or :c:member:`~PyConfig.base_exec_prefix`
14387db96d56Sopenharmony_cifields are not set, they inherit their value from :c:member:`~PyConfig.prefix`
14397db96d56Sopenharmony_ciand :c:member:`~PyConfig.exec_prefix` respectively.
14407db96d56Sopenharmony_ci
14417db96d56Sopenharmony_ci:c:func:`Py_RunMain` and :c:func:`Py_Main` modify :data:`sys.path`:
14427db96d56Sopenharmony_ci
14437db96d56Sopenharmony_ci* If :c:member:`~PyConfig.run_filename` is set and is a directory which contains a
14447db96d56Sopenharmony_ci  ``__main__.py`` script, prepend :c:member:`~PyConfig.run_filename` to
14457db96d56Sopenharmony_ci  :data:`sys.path`.
14467db96d56Sopenharmony_ci* If :c:member:`~PyConfig.isolated` is zero:
14477db96d56Sopenharmony_ci
14487db96d56Sopenharmony_ci  * If :c:member:`~PyConfig.run_module` is set, prepend the current directory
14497db96d56Sopenharmony_ci    to :data:`sys.path`. Do nothing if the current directory cannot be read.
14507db96d56Sopenharmony_ci  * If :c:member:`~PyConfig.run_filename` is set, prepend the directory of the
14517db96d56Sopenharmony_ci    filename to :data:`sys.path`.
14527db96d56Sopenharmony_ci  * Otherwise, prepend an empty string to :data:`sys.path`.
14537db96d56Sopenharmony_ci
14547db96d56Sopenharmony_ciIf :c:member:`~PyConfig.site_import` is non-zero, :data:`sys.path` can be
14557db96d56Sopenharmony_cimodified by the :mod:`site` module. If
14567db96d56Sopenharmony_ci:c:member:`~PyConfig.user_site_directory` is non-zero and the user's
14577db96d56Sopenharmony_cisite-package directory exists, the :mod:`site` module appends the user's
14587db96d56Sopenharmony_cisite-package directory to :data:`sys.path`.
14597db96d56Sopenharmony_ci
14607db96d56Sopenharmony_ciThe following configuration files are used by the path configuration:
14617db96d56Sopenharmony_ci
14627db96d56Sopenharmony_ci* ``pyvenv.cfg``
14637db96d56Sopenharmony_ci* ``._pth`` file (ex: ``python._pth``)
14647db96d56Sopenharmony_ci* ``pybuilddir.txt`` (Unix only)
14657db96d56Sopenharmony_ci
14667db96d56Sopenharmony_ciIf a ``._pth`` file is present:
14677db96d56Sopenharmony_ci
14687db96d56Sopenharmony_ci* Set :c:member:`~PyConfig.isolated` to ``1``.
14697db96d56Sopenharmony_ci* Set :c:member:`~PyConfig.use_environment` to ``0``.
14707db96d56Sopenharmony_ci* Set :c:member:`~PyConfig.site_import` to ``0``.
14717db96d56Sopenharmony_ci* Set :c:member:`~PyConfig.safe_path` to ``1``.
14727db96d56Sopenharmony_ci
14737db96d56Sopenharmony_ciThe ``__PYVENV_LAUNCHER__`` environment variable is used to set
14747db96d56Sopenharmony_ci:c:member:`PyConfig.base_executable`
14757db96d56Sopenharmony_ci
14767db96d56Sopenharmony_ci
14777db96d56Sopenharmony_ciPy_RunMain()
14787db96d56Sopenharmony_ci============
14797db96d56Sopenharmony_ci
14807db96d56Sopenharmony_ci.. c:function:: int Py_RunMain(void)
14817db96d56Sopenharmony_ci
14827db96d56Sopenharmony_ci   Execute the command (:c:member:`PyConfig.run_command`), the script
14837db96d56Sopenharmony_ci   (:c:member:`PyConfig.run_filename`) or the module
14847db96d56Sopenharmony_ci   (:c:member:`PyConfig.run_module`) specified on the command line or in the
14857db96d56Sopenharmony_ci   configuration.
14867db96d56Sopenharmony_ci
14877db96d56Sopenharmony_ci   By default and when if :option:`-i` option is used, run the REPL.
14887db96d56Sopenharmony_ci
14897db96d56Sopenharmony_ci   Finally, finalizes Python and returns an exit status that can be passed to
14907db96d56Sopenharmony_ci   the ``exit()`` function.
14917db96d56Sopenharmony_ci
14927db96d56Sopenharmony_ciSee :ref:`Python Configuration <init-python-config>` for an example of
14937db96d56Sopenharmony_cicustomized Python always running in isolated mode using
14947db96d56Sopenharmony_ci:c:func:`Py_RunMain`.
14957db96d56Sopenharmony_ci
14967db96d56Sopenharmony_ci
14977db96d56Sopenharmony_ciPy_GetArgcArgv()
14987db96d56Sopenharmony_ci================
14997db96d56Sopenharmony_ci
15007db96d56Sopenharmony_ci.. c:function:: void Py_GetArgcArgv(int *argc, wchar_t ***argv)
15017db96d56Sopenharmony_ci
15027db96d56Sopenharmony_ci   Get the original command line arguments, before Python modified them.
15037db96d56Sopenharmony_ci
15047db96d56Sopenharmony_ci   See also :c:member:`PyConfig.orig_argv` member.
15057db96d56Sopenharmony_ci
15067db96d56Sopenharmony_ci
15077db96d56Sopenharmony_ciMulti-Phase Initialization Private Provisional API
15087db96d56Sopenharmony_ci==================================================
15097db96d56Sopenharmony_ci
15107db96d56Sopenharmony_ciThis section is a private provisional API introducing multi-phase
15117db96d56Sopenharmony_ciinitialization, the core feature of :pep:`432`:
15127db96d56Sopenharmony_ci
15137db96d56Sopenharmony_ci* "Core" initialization phase, "bare minimum Python":
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_ci  * Builtin types;
15167db96d56Sopenharmony_ci  * Builtin exceptions;
15177db96d56Sopenharmony_ci  * Builtin and frozen modules;
15187db96d56Sopenharmony_ci  * The :mod:`sys` module is only partially initialized
15197db96d56Sopenharmony_ci    (ex: :data:`sys.path` doesn't exist yet).
15207db96d56Sopenharmony_ci
15217db96d56Sopenharmony_ci* "Main" initialization phase, Python is fully initialized:
15227db96d56Sopenharmony_ci
15237db96d56Sopenharmony_ci  * Install and configure :mod:`importlib`;
15247db96d56Sopenharmony_ci  * Apply the :ref:`Path Configuration <init-path-config>`;
15257db96d56Sopenharmony_ci  * Install signal handlers;
15267db96d56Sopenharmony_ci  * Finish :mod:`sys` module initialization (ex: create :data:`sys.stdout`
15277db96d56Sopenharmony_ci    and :data:`sys.path`);
15287db96d56Sopenharmony_ci  * Enable optional features like :mod:`faulthandler` and :mod:`tracemalloc`;
15297db96d56Sopenharmony_ci  * Import the :mod:`site` module;
15307db96d56Sopenharmony_ci  * etc.
15317db96d56Sopenharmony_ci
15327db96d56Sopenharmony_ciPrivate provisional API:
15337db96d56Sopenharmony_ci
15347db96d56Sopenharmony_ci* :c:member:`PyConfig._init_main`: if set to ``0``,
15357db96d56Sopenharmony_ci  :c:func:`Py_InitializeFromConfig` stops at the "Core" initialization phase.
15367db96d56Sopenharmony_ci* :c:member:`PyConfig._isolated_interpreter`: if non-zero,
15377db96d56Sopenharmony_ci  disallow threads, subprocesses and fork.
15387db96d56Sopenharmony_ci
15397db96d56Sopenharmony_ci.. c:function:: PyStatus _Py_InitializeMain(void)
15407db96d56Sopenharmony_ci
15417db96d56Sopenharmony_ci   Move to the "Main" initialization phase, finish the Python initialization.
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ciNo module is imported during the "Core" phase and the ``importlib`` module is
15447db96d56Sopenharmony_cinot configured: the :ref:`Path Configuration <init-path-config>` is only
15457db96d56Sopenharmony_ciapplied during the "Main" phase. It may allow to customize Python in Python to
15467db96d56Sopenharmony_cioverride or tune the :ref:`Path Configuration <init-path-config>`, maybe
15477db96d56Sopenharmony_ciinstall a custom :data:`sys.meta_path` importer or an import hook, etc.
15487db96d56Sopenharmony_ci
15497db96d56Sopenharmony_ciIt may become possible to calculatin the :ref:`Path Configuration
15507db96d56Sopenharmony_ci<init-path-config>` in Python, after the Core phase and before the Main phase,
15517db96d56Sopenharmony_ciwhich is one of the :pep:`432` motivation.
15527db96d56Sopenharmony_ci
15537db96d56Sopenharmony_ciThe "Core" phase is not properly defined: what should be and what should
15547db96d56Sopenharmony_cinot be available at this phase is not specified yet. The API is marked
15557db96d56Sopenharmony_cias private and provisional: the API can be modified or even be removed
15567db96d56Sopenharmony_cianytime until a proper public API is designed.
15577db96d56Sopenharmony_ci
15587db96d56Sopenharmony_ciExample running Python code between "Core" and "Main" initialization
15597db96d56Sopenharmony_ciphases::
15607db96d56Sopenharmony_ci
15617db96d56Sopenharmony_ci    void init_python(void)
15627db96d56Sopenharmony_ci    {
15637db96d56Sopenharmony_ci        PyStatus status;
15647db96d56Sopenharmony_ci
15657db96d56Sopenharmony_ci        PyConfig config;
15667db96d56Sopenharmony_ci        PyConfig_InitPythonConfig(&config);
15677db96d56Sopenharmony_ci        config._init_main = 0;
15687db96d56Sopenharmony_ci
15697db96d56Sopenharmony_ci        /* ... customize 'config' configuration ... */
15707db96d56Sopenharmony_ci
15717db96d56Sopenharmony_ci        status = Py_InitializeFromConfig(&config);
15727db96d56Sopenharmony_ci        PyConfig_Clear(&config);
15737db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
15747db96d56Sopenharmony_ci            Py_ExitStatusException(status);
15757db96d56Sopenharmony_ci        }
15767db96d56Sopenharmony_ci
15777db96d56Sopenharmony_ci        /* Use sys.stderr because sys.stdout is only created
15787db96d56Sopenharmony_ci           by _Py_InitializeMain() */
15797db96d56Sopenharmony_ci        int res = PyRun_SimpleString(
15807db96d56Sopenharmony_ci            "import sys; "
15817db96d56Sopenharmony_ci            "print('Run Python code before _Py_InitializeMain', "
15827db96d56Sopenharmony_ci                   "file=sys.stderr)");
15837db96d56Sopenharmony_ci        if (res < 0) {
15847db96d56Sopenharmony_ci            exit(1);
15857db96d56Sopenharmony_ci        }
15867db96d56Sopenharmony_ci
15877db96d56Sopenharmony_ci        /* ... put more configuration code here ... */
15887db96d56Sopenharmony_ci
15897db96d56Sopenharmony_ci        status = _Py_InitializeMain();
15907db96d56Sopenharmony_ci        if (PyStatus_Exception(status)) {
15917db96d56Sopenharmony_ci            Py_ExitStatusException(status);
15927db96d56Sopenharmony_ci        }
15937db96d56Sopenharmony_ci    }
1594