# Configuración de inicialización de Python

## PyInitConfig C API

Added in version 3.14.

Python can be initialized with `Py_InitializeFromInitConfig()`.

La función `Py_RunMain()` se puede utilizar para escribir un programa Python personalizado.

Consulte también Inicialización, finalización y subprocesos.

Ver también

PEP 741 «Python Configuration C API».

### Ejemplo

Example of customized Python always running with the Python Development Mode enabled; return `-1` on error:

    int init_python(void)
    {
        PyInitConfig *config = PyInitConfig_Create();
        if (config == NULL) {
            printf("PYTHON INIT ERROR: memory allocation failed\n");
            return -1;
        }

        // Enable the Python Development Mode
        if (PyInitConfig_SetInt(config, "dev_mode", 1) < 0) {
            goto error;
        }

        // Initialize Python with the configuration
        if (Py_InitializeFromInitConfig(config) < 0) {
            goto error;
        }
        PyInitConfig_Free(config);
        return 0;

    error:
        {
            // Display the error message.
            //
            // This uncommon braces style is used, because you cannot make
            // goto targets point to variable declarations.
            const char *err_msg;
            (void)PyInitConfig_GetError(config, &err_msg);
            printf("PYTHON INIT ERROR: %s\n", err_msg);
            PyInitConfig_Free(config);
            return -1;
        }
    }

### Create Config

struct PyInitConfig

  Opaque structure to configure the Python initialization.

PyInitConfig *PyInitConfig_Create(void)

  Create a new initialization configuration using Isolated Configuration default values.

  It must be freed by `PyInitConfig_Free()`.

  Return `NULL` on memory allocation failure.

void PyInitConfig_Free(PyInitConfig *config)

  Free memory of the initialization configuration config.

  If config is `NULL`, no operation is performed.

### Error Handling

int PyInitConfig_GetError(PyInitConfig *config, const char **err_msg)

  Get the config error message.

  - Set *err_msg and return `1` if an error is set.

  - Set *err_msg to `NULL` and return `0` otherwise.

  An error message is a UTF-8 encoded string.

  If config has an exit code, format the exit code as an error message.

  The error message remains valid until another `PyInitConfig` function is called with config. The caller doesn’t have to free the error message.

int PyInitConfig_GetExitCode(PyInitConfig *config, int *exitcode)

  Get the config exit code.

  - Set *exitcode and return `1` if config has an exit code set.

  - Return `0` if config has no exit code set.

  Only the `Py_InitializeFromInitConfig()` function can set an exit code if the `parse_argv` option is non-zero.

  An exit code can be set when parsing the command line failed (exit code `2`) or when a command line option asks to display the command line help (exit code `0`).

### Get Options

The configuration option name parameter must be a non-NULL null-terminated UTF-8 encoded string. See Configuration Options.

int PyInitConfig_HasOption(PyInitConfig *config, const char *name)

  Test if the configuration has an option called name.

  Return `1` if the option exists, or return `0` otherwise.

int PyInitConfig_GetInt(PyInitConfig *config, const char *name, int64_t *value)

  Get an integer configuration option.

  - Set *value, and return `0` on success.

  - Set an error in config and return `-1` on error.

int PyInitConfig_GetStr(PyInitConfig *config, const char *name, char **value)

  Get a string configuration option as a null-terminated UTF-8 encoded string.

  - Set *value, and return `0` on success.

  - Set an error in config and return `-1` on error.

  *value can be set to `NULL` if the option is an optional string and the option is unset.

  On success, the string must be released with `free(value)` if it’s not `NULL`.

int PyInitConfig_GetStrList(PyInitConfig *config, const char *name, size_t *length, char ***items)

  Get a string list configuration option as an array of null-terminated UTF-8 encoded strings.

  - Set *length and *value, and return `0` on success.

  - Set an error in config and return `-1` on error.

  On success, the string list must be released with `PyInitConfig_FreeStrList(length, items)`.

void PyInitConfig_FreeStrList(size_t length, char **items)

  Free memory of a string list created by `PyInitConfig_GetStrList()`.

### Set Options

The configuration option name parameter must be a non-NULL null-terminated UTF-8 encoded string. See Configuration Options.

Some configuration options have side effects on other options. This logic is only implemented when `Py_InitializeFromInitConfig()` is called, not by the «Set» functions below. For example, setting `dev_mode` to `1` does not set `faulthandler` to `1`.

int PyInitConfig_SetInt(PyInitConfig *config, const char *name, int64_t value)

  Set an integer configuration option.

  - Return `0` on success.

  - Set an error in config and return `-1` on error.

int PyInitConfig_SetStr(PyInitConfig *config, const char *name, const char *value)

  Set a string configuration option from a null-terminated UTF-8 encoded string. The string is copied.

  - Return `0` on success.

  - Set an error in config and return `-1` on error.

int PyInitConfig_SetStrList(PyInitConfig *config, const char *name, size_t length, char *const *items)

  Set a string list configuration option from an array of null-terminated UTF-8 encoded strings. The string list is copied.

  - Return `0` on success.

  - Set an error in config and return `-1` on error.

### Module

int PyInitConfig_AddModule(PyInitConfig *config, const char *name, PyObject *(*initfunc)(void))

  Add a built-in extension module to the table of built-in modules.

  The new module can be imported by the name name, and uses the function initfunc as the initialization function called on the first attempted import.

  - Return `0` on success.

  - Set an error in config and return `-1` on error.

  If Python is initialized multiple times, `PyInitConfig_AddModule()` must be called at each Python initialization.

  Similar to the `PyImport_AppendInittab()` function.

### Initialize Python

int Py_InitializeFromInitConfig(PyInitConfig *config)

  Initialize Python from the initialization configuration.

  - Return `0` on success.

  - Set an error in config and return `-1` on error.

  - Set an exit code in config and return `-1` if Python wants to exit.

  See `PyInitConfig_GetExitcode()` for the exit code case.

## Configuration Options

Option | PyConfig/PyPreConfig member | Type | Visibility
--- | --- | --- | ---
`"allocator"` | `allocator` | `int` | Read-only
`"argv"` | `argv` | `list[str]` | Public
`"base_exec_prefix"` | `base_exec_prefix` | `str` | Public
`"base_executable"` | `base_executable` | `str` | Public
`"base_prefix"` | `base_prefix` | `str` | Public
`"buffered_stdio"` | `buffered_stdio` | `bool` | Read-only
`"bytes_warning"` | `bytes_warning` | `int` | Public
`"check_hash_pycs_mode"` | `check_hash_pycs_mode` | `str` | Read-only
`"code_debug_ranges"` | `code_debug_ranges` | `bool` | Read-only
`"coerce_c_locale"` | `coerce_c_locale` | `bool` | Read-only
`"coerce_c_locale_warn"` | `coerce_c_locale_warn` | `bool` | Read-only
`"configure_c_stdio"` | `configure_c_stdio` | `bool` | Read-only
`"configure_locale"` | `configure_locale` | `bool` | Read-only
`"cpu_count"` | `cpu_count` | `int` | Public
`"dev_mode"` | `dev_mode` | `bool` | Read-only
`"dump_refs"` | `dump_refs` | `bool` | Read-only
`"dump_refs_file"` | `dump_refs_file` | `str` | Read-only
`"exec_prefix"` | `exec_prefix` | `str` | Public
`"executable"` | `executable` | `str` | Public
`"faulthandler"` | `faulthandler` | `bool` | Read-only
`"filesystem_encoding"` | `filesystem_encoding` | `str` | Read-only
`"filesystem_errors"` | `filesystem_errors` | `str` | Read-only
`"hash_seed"` | `hash_seed` | `int` | Read-only
`"home"` | `home` | `str` | Read-only
`"import_time"` | `import_time` | `int` | Read-only
`"inspect"` | `inspect` | `bool` | Public
`"install_signal_handlers"` | `install_signal_handlers` | `bool` | Read-only
`"int_max_str_digits"` | `int_max_str_digits` | `int` | Public
`"interactive"` | `interactive` | `bool` | Public
`"isolated"` | `isolated` | `bool` | Read-only
`"legacy_windows_fs_encoding"` | `legacy_windows_fs_encoding` | `bool` | Read-only
`"legacy_windows_stdio"` | `legacy_windows_stdio` | `bool` | Read-only
`"malloc_stats"` | `malloc_stats` | `bool` | Read-only
`"module_search_paths"` | `module_search_paths` | `list[str]` | Public
`"optimization_level"` | `optimization_level` | `int` | Public
`"orig_argv"` | `orig_argv` | `list[str]` | Read-only
`"parse_argv"` | `parse_argv` | `bool` | Read-only
`"parser_debug"` | `parser_debug` | `bool` | Public
`"pathconfig_warnings"` | `pathconfig_warnings` | `bool` | Read-only
`"perf_profiling"` | `perf_profiling` | `bool` | Read-only
`"platlibdir"` | `platlibdir` | `str` | Public
`"prefix"` | `prefix` | `str` | Public
`"program_name"` | `program_name` | `str` | Read-only
`"pycache_prefix"` | `pycache_prefix` | `str` | Public
`"quiet"` | `quiet` | `bool` | Public
`"run_command"` | `run_command` | `str` | Read-only
`"run_filename"` | `run_filename` | `str` | Read-only
`"run_module"` | `run_module` | `str` | Read-only
`"run_presite"` | `run_presite` | `str` | Read-only
`"safe_path"` | `safe_path` | `bool` | Read-only
`"show_ref_count"` | `show_ref_count` | `bool` | Read-only
`"site_import"` | `site_import` | `bool` | Read-only
`"skip_source_first_line"` | `skip_source_first_line` | `bool` | Read-only
`"stdio_encoding"` | `stdio_encoding` | `str` | Read-only
`"stdio_errors"` | `stdio_errors` | `str` | Read-only
`"stdlib_dir"` | `stdlib_dir` | `str` | Public
`"tracemalloc"` | `tracemalloc` | `int` | Read-only
`"use_environment"` | `use_environment` | `bool` | Public
`"use_frozen_modules"` | `use_frozen_modules` | `bool` | Read-only
`"use_hash_seed"` | `use_hash_seed` | `bool` | Read-only
`"use_system_logger"` | `use_system_logger` | `bool` | Read-only
`"user_site_directory"` | `user_site_directory` | `bool` | Read-only
`"utf8_mode"` | `utf8_mode` | `bool` | Read-only
`"verbose"` | `verbose` | `int` | Public
`"warn_default_encoding"` | `warn_default_encoding` | `bool` | Read-only
`"warnoptions"` | `warnoptions` | `list[str]` | Public
`"write_bytecode"` | `write_bytecode` | `bool` | Public
`"xoptions"` | `xoptions` | `dict[str, str]` | Public
`"_pystats"` | `_pystats` | `bool` | Read-only

Visibility:

- Public: Can be retrieved by `PyConfig_Get()` and set by `PyConfig_Set()`.

- Read-only: Can be retrieved by `PyConfig_Get()`, but cannot be set by `PyConfig_Set()`.

## Runtime Python configuration API

At runtime, it’s possible to get and set configuration options using `PyConfig_Get()` and `PyConfig_Set()` functions.

The configuration option name parameter must be a non-NULL null-terminated UTF-8 encoded string. See Configuration Options.

Some options are read from the `sys` attributes. For example, the option `"argv"` is read from `sys.argv`.

PyObject *PyConfig_Get(const char *name)

  Get the current runtime value of a configuration option as a Python object.

  - Return a new reference on success.

  - Set an exception and return `NULL` on error.

  The object type depends on the configuration option. It can be:

  - `bool`

  - `int`

  - `str`

  - `list[str]`

  - `dict[str, str]`

  The caller must have an attached thread state. The function cannot be called before Python initialization nor after Python finalization.

  Added in version 3.14.

int PyConfig_GetInt(const char *name, int *value)

  Similar to `PyConfig_Get()`, but get the value as a C int.

  - Return `0` on success.

  - Set an exception and return `-1` on error.

  Added in version 3.14.

PyObject *PyConfig_Names(void)

  Get all configuration option names as a `frozenset`.

  - Return a new reference on success.

  - Set an exception and return `NULL` on error.

  The caller must have an attached thread state. The function cannot be called before Python initialization nor after Python finalization.

  Added in version 3.14.

int PyConfig_Set(const char *name, PyObject *value)

  Set the current runtime value of a configuration option.

  - Raise a `ValueError` if there is no option name.

  - Raise a `ValueError` if value is an invalid value.

  - Raise a `ValueError` if the option is read-only (cannot be set).

  - Raise a `TypeError` if value has not the proper type.

  The caller must have an attached thread state. The function cannot be called before Python initialization nor after Python finalization.

  Raises an auditing event `cpython.PyConfig_Set` with arguments `name`, `value`.

  Added in version 3.14.

  Distinto en la versión 3.16.0a0 (unreleased): The function now replaces `sys.flags` (create a new object), instead of modifying `sys.flags` in-place.

## PyConfig C API

Added in version 3.8.

Python se puede inicializar con `Py_InitializeFromConfig()` y la estructura `PyConfig`. Se puede preinicializar con `Py_PreInitialize()` y la estructura `PyPreConfig`.

Hay dos tipos de configuración:

- La Configuración de Python se puede utilizar para crear un Python personalizado que se comporte como el Python normal. Por ejemplo, las variables de entorno y los argumentos de la línea de comandos se utilizan para configurar Python.

- La Configuración Aislada se puede utilizar para incrustar Python en una aplicación. Aísla a Python del sistema. Por ejemplo, las variables de entorno se ignoran, la configuración regional LC_CTYPE se deja sin cambios y no se registra ningún manejador de señales.

La función `Py_RunMain()` se puede utilizar para escribir un programa Python personalizado.

Consulte también Inicialización, finalización y subprocesos.

Ver también

PEP 587 «Configuración de inicialización de Python».

### Ejemplo

Ejemplo de Python personalizado que siempre se ejecuta en modo aislado:

    int main(int argc, char **argv)
    {
        PyStatus status;

        PyConfig config;
        PyConfig_InitPythonConfig(&config);
        config.isolated = 1;

        /* Decode command line arguments.
           Implicitly preinitialize Python (in isolated mode). */
        status = PyConfig_SetBytesArgv(&config, argc, argv);
        if (PyStatus_Exception(status)) {
            goto exception;
        }

        status = Py_InitializeFromConfig(&config);
        if (PyStatus_Exception(status)) {
            goto exception;
        }
        PyConfig_Clear(&config);

        return Py_RunMain();

    exception:
        PyConfig_Clear(&config);
        if (PyStatus_IsExit(status)) {
            return status.exitcode;
        }
        /* Display the error message and exit the process with
           non-zero exit code */
        Py_ExitStatusException(status);
    }

### PyWideStringList

type PyWideStringList

  Lista de cadenas de caracteres `wchar_t*`.

  Si length no es cero, items no deben ser `NULL` y todas las cadenas de caracteres deben ser no `NULL`.

  Métodos:

  PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)

    Agregar item a list.

    Python debe estar preinicializado para llamar a esta función.

  PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)

    Inserta item en list en index.

    Si index es mayor o igual que el largo de list, agrega item a list.

    index debe ser mayor o igual que `0`.

    Python debe estar preinicializado para llamar a esta función.

  Campos de estructura:

  Py_ssize_t length

    Longitud de la lista.

  wchar_t **items

    Elementos de la lista.

### PyStatus

type PyStatus

  Estructura para almacenar el estado de una función de inicialización: éxito, error o salida.

  Para un error, puede almacenar el nombre de la función C que creó el error.

  Campos de estructura:

  int exitcode

    Código de salida El argumento pasó a `exit()`.

  const char *err_msg

    Mensaje de error.

  const char *func

    El nombre de la función que creó un error puede ser `NULL`.

  Funciones para crear un estado:

  PyStatus PyStatus_Ok(void)

    Éxito.

  PyStatus PyStatus_Error(const char *err_msg)

    Error de inicialización con un mensaje.

    err_msg no debe ser `NULL`.

  PyStatus PyStatus_NoMemory(void)

    Error de asignación de memoria (sin memoria).

  PyStatus PyStatus_Exit(int exitcode)

    Sale de Python con el código de salida especificado.

  Funciones para manejar un estado:

  int PyStatus_Exception(PyStatus status)

    ¿Es el estado un error o una salida? Si es verdadero, la excepción debe ser manejada; por ejemplo llamando a `Py_ExitStatusException()`.

  int PyStatus_IsError(PyStatus status)

    ¿Es el resultado un error?

  int PyStatus_IsExit(PyStatus status)

    ¿El resultado es una salida?

  void Py_ExitStatusException(PyStatus status)

    Llama a `exit(exitcode)` si status es una salida. Imprime el mensaje de error y sale con un código de salida distinto de cero si status es un error. Solo se debe llamar si `PyStatus_Exception(status)` no es cero.

Nota

Internamente, Python usa macros que establecen `PyStatus.func`, mientras que las funciones para crear un estado establecen `func` en `NULL`.

Ejemplo:

    PyStatus alloc(void **ptr, size_t size)
    {
        *ptr = PyMem_RawMalloc(size);
        if (*ptr == NULL) {
            return PyStatus_NoMemory();
        }
        return PyStatus_Ok();
    }

    int main(int argc, char **argv)
    {
        void *ptr;
        PyStatus status = alloc(&ptr, 16);
        if (PyStatus_Exception(status)) {
            Py_ExitStatusException(status);
        }
        PyMem_Free(ptr);
        return 0;
    }

### PyPreConfig

type PyPreConfig

  Estructura utilizada para preinicializar Python.

  Función para inicializar una preconfiguración:

  void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)

    Inicializa la preconfiguración con Configuración de Python.

  void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)

    Inicializa la preconfiguración con Configuración aislada.

  Campos de estructura:

  int allocator

    Nombre de los asignadores de memoria de Python:

    - `PYMEM_ALLOCATOR_NOT_SET` (`0`): no cambia asignadores de memoria (usa los valores predeterminados)

    - `PYMEM_ALLOCATOR_DEFAULT` (`1`): asignadores de memoria predeterminados.

    - `PYMEM_ALLOCATOR_DEBUG` (`2`): asignadores de memoria predeterminados con ganchos de depuración.

    - `PYMEM_ALLOCATOR_MALLOC` (`3`): usa `malloc()` de la biblioteca C.

    - `PYMEM_ALLOCATOR_MALLOC_DEBUG` (`4`): fuerza el uso de `malloc()` con ganchos de depuración.

    - `PYMEM_ALLOCATOR_PYMALLOC` (`5`): asignador de memoria pymalloc de Python.

    - `PYMEM_ALLOCATOR_PYMALLOC_DEBUG` (`6`): asignador de memoria pymalloc de Python con ganchos de depuración.

    - `PYMEM_ALLOCATOR_MIMALLOC` (`6`): usa `mimalloc`, un reemplazo rápido de malloc.

    - `PYMEM_ALLOCATOR_MIMALLOC_DEBUG` (`7`): usa `mimalloc`, un reemplazo rápido de malloc con ganchos de depuración.

    `PYMEM_ALLOCATOR_PYMALLOC` y `PYMEM_ALLOCATOR_PYMALLOC_DEBUG` no son compatibles si Python es `configurado usando --without-pymalloc`.

    `PYMEM_ALLOCATOR_MIMALLOC` y `PYMEM_ALLOCATOR_MIMALLOC_DEBUG` no son compatibles si Python es `configurado usando --without-mimalloc` o si el soporte atómico subyacente no está disponible.

    Ver Administración de memorias.

    Predeterminado: `PYMEM_ALLOCATOR_NOT_SET`.

  int configure_locale

    Establece la configuración regional LC_CTYPE a la configuración regional preferida del usuario.

    Si es igual a `0`, establece los miembros `coerce_c_locale` y `coerce_c_locale_warn` a `0`.

    Vea el locale encoding.

    Predeterminado: `1` en la configuración de Python, `0` en la configuración aislada.

  int coerce_c_locale

    Si es igual a `2`, imponga la configuración regional C.

    Si es igual a `1`, lee la configuración regional LC_CTYPE para decidir si debe ser forzada.

    Vea el locale encoding.

    Predeterminado: `-1` en la configuración de Python, `0` en la configuración aislada.

  int coerce_c_locale_warn

    Si no es cero, emita una advertencia si la configuración regional C está coaccionada.

    Predeterminado: `-1` en la configuración de Python, `0` en la configuración aislada.

  int dev_mode

    Modo de desarrollo de Python: consulte `PyConfig.dev_mode`.

    Por defecto: `-1` en modo Python, `0` en modo aislado.

  int isolated

    Modo aislado: consulte `PyConfig.isolated`.

    Por defecto: `0` en modo Python, `1` en modo aislado.

  int legacy_windows_fs_encoding

    Si no es cero:

    - Establezca `PyPreConfig.utf8_mode` en `0`,

    - Establezca `PyConfig.filesystem_encoding` en `"mbcs"`,

    - Establezca `PyConfig.filesystem_errors` en `"replace"`.

    Inicializado desde el valor de la variable de entorno `PYTHONLEGACYWINDOWSFSENCODING`.

    Solo disponible en Windows. La macro `#ifdef MS_WINDOWS` se puede usar para el código específico de Windows.

    Predeterminado: `0`.

  int parse_argv

    Si no es cero, `Py_PreInitializeFromArgs()` y `Py_PreInitializeFromBytesArgs()` analizan su argumento `argv` de la misma manera que Python analiza los argumentos de la línea de comandos: ver Argumentos de línea de comandos.

    Predeterminado: `1` en la configuración de Python, `0` en la configuración aislada.

  int use_environment

    ¿Utiliza variables de entorno? Consulte `PyConfig.use_environment`.

    Predeterminado: `1` en la configuración de Python y `0` en la configuración aislada.

  int utf8_mode

    Si es distinto de cero, habilite Python UTF-8 Mode.

    Establecido a `0` o `1` por la opción de línea de comandos `-X utf8` y la variable de entorno `PYTHONUTF8`.

    Predeterminado: `1`.

### Preinicialización de Python con PyPreConfig

La preinicialización de Python:

- Establecer los asignadores de memoria de Python (`PyPreConfig.allocator`)

- Configurar la configuración regional LC_CTYPE (locale encoding)

- Establecer el Python UTF-8 Mode (`PyPreConfig.utf8_mode`)

La preconfiguración actual (tipo `PyPreConfig`) se almacena en `_PyRuntime.preconfig`.

Funciones para preinicializar Python:

PyStatus Py_PreInitialize(const PyPreConfig *preconfig)

  Preinicializa Python desde la preconfiguración preconfig.

  preconfig no debe ser `NULL`.

PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char *const *argv)

  Preinicializa Python desde la preconfiguración preconfig.

  Analice los argumentos de la línea de comando argv (cadenas de bytes) si `parse_argv` de preconfig no es cero.

  preconfig no debe ser `NULL`.

PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t *const *argv)

  Preinicializa Python desde la preconfiguración preconfig.

  Analice los argumentos de la línea de comando argv (cadenas anchas) si `parse_argv` de preconfig no es cero.

  preconfig no debe ser `NULL`.

La persona que llama es responsable de manejar las excepciones (error o salida) usando `PyStatus_Exception()` y `Py_ExitStatusException()`.

Para Configuración de Python (`PyPreConfig_InitPythonConfig()`), si Python se inicializa con argumentos de línea de comando, los argumentos de la línea de comando también deben pasarse para preinicializar Python, ya que tienen un efecto en la preconfiguración como codificaciones. Por ejemplo, la opción de línea de comando `-X utf8` habilita el Python UTF-8 Mode.

`PyMem_SetAllocator()` se puede llamar después de `Py_PreInitialize()` y antes `Py_InitializeFromConfig()` para instalar un asignador de memoria personalizado. Se puede llamar antes `Py_PreInitialize()` si `PyPreConfig.allocator` está configurado en `PYMEM_ALLOCATOR_NOT_SET`.

Las funciones de asignación de memoria de Python como `PyMem_RawMalloc()` no deben usarse antes de la preinicialización de Python, mientras que llamar directamente a `malloc()` y `free()` siempre es seguro. No se debe llamar a `Py_DecodeLocale()` antes de la preinicialización de Python.

Ejemplo usando la preinicialización para habilitar el Python UTF-8 Mode

    PyStatus status;
    PyPreConfig preconfig;
    PyPreConfig_InitPythonConfig(&preconfig);

    preconfig.utf8_mode = 1;

    status = Py_PreInitialize(&preconfig);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }

    /* at this point, Python speaks UTF-8 */

    Py_Initialize();
    /* ... use Python API here ... */
    Py_Finalize();

### PyConfig

type PyConfig

  Estructura que contiene la mayoría de los parámetros para configurar Python.

  Cuando termine, se debe utilizar la función `PyConfig_Clear()` para liberar la memoria de configuración.

  Métodos de estructura:

  void PyConfig_InitPythonConfig(PyConfig *config)

    Inicialice la configuración con la Configuración de Python.

  void PyConfig_InitIsolatedConfig(PyConfig *config)

    Inicialice la configuración con la Configuración Aislada.

  PyStatus PyConfig_SetString(PyConfig *config, wchar_t *const *config_str, const wchar_t *str)

    Copia la cadena de caracteres anchos str en `*config_str`.

    Preinicializa Python si es necesario.

  PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t *const *config_str, const char *str)

    Decodifique str usando `Py_DecodeLocale()` y establezca el resultado en `*config_str`.

    Preinicializa Python si es necesario.

  PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t *const *argv)

    Configure los argumentos de la línea de comando (miembro `argv` de config) de la lista argv de cadenas de caracteres anchas.

    Preinicializa Python si es necesario.

  PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char *const *argv)

    Establezca argumentos de línea de comando (miembro `argv` de config) de la lista argv de cadenas de bytes. Decodifica bytes usando `Py_DecodeLocale()`.

    Preinicializa Python si es necesario.

  PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)

    Establece la lista de cadenas de caracteres anchas list a length y items.

    Preinicializa Python si es necesario.

  PyStatus PyConfig_Read(PyConfig *config)

    Lee toda la configuración de Python.

    Los campos que ya están inicializados no se modifican.

    Los campos para la configuración de ruta ya no se calculan ni modifican al llamar a esta función, a partir de Python 3.11.

    La función `PyConfig_Read()` solo analiza los argumentos `PyConfig.argv` una vez: `PyConfig.parse_argv` se establece en `2` después de que se analizan los argumentos. Como los argumentos de Python se eliminan de `PyConfig.argv`, analizar los argumentos dos veces analizaría las opciones de la aplicación como opciones de Python.

    Preinicializa Python si es necesario.

    Distinto en la versión 3.10: Los argumentos `PyConfig.argv` ahora solo se analizan una vez, `PyConfig.parse_argv` se establece en `2` después de analizar los argumentos y los argumentos solo se analizan si `PyConfig.parse_argv` es igual a `1`.

    Distinto en la versión 3.11: `PyConfig_Read()` ya no calcula todas las rutas, por lo que los campos listados en Python Path Configuration ya no pueden ser actualizados hasta que se llame a `Py_InitializeFromConfig()`.

  void PyConfig_Clear(PyConfig *config)

    Libera memoria de configuración.

  Most `PyConfig` methods preinitialize Python if needed. In that case, the Python preinitialization configuration (`PyPreConfig`) is based on the `PyConfig`. If configuration fields which are in common with `PyPreConfig` are tuned, they must be set before calling a `PyConfig` method:

  - `PyConfig.dev_mode`

  - `PyConfig.isolated`

  - `PyConfig.parse_argv`

  - `PyConfig.use_environment`

  Además, si se usa `PyConfig_SetArgv()` o `PyConfig_SetBytesArgv()`, este método debe llamarse antes que otros métodos, ya que la configuración de preinicialización depende de los argumentos de la línea de comando (si `parse_argv` no es cero).

  Quien llama de estos métodos es responsable de manejar las excepciones (error o salida) usando `PyStatus_Exception()` y `Py_ExitStatusException()`.

  Campos de estructura:

  PyWideStringList argv

    Establece los argumentos de la línea de comandos `sys.argv` basados en `argv`. Estos parámetros son similares a los pasados a la función `main()` del programa con la diferencia de que la primera entrada debe referirse al archivo de script a ejecutar en lugar del ejecutable que aloja al intérprete de Python. Si no hay un script que se vaya a ejecutar, la primera entrada en `argv` puede ser una cadena vacía.

    Configure `parse_argv` en `1` para analizar `argv` de la misma manera que Python normal analiza los argumentos de la línea de comandos de Python y luego quita los argumentos de Python de `argv`.

    Si `argv` está vacío, se agrega una cadena vacía para garantizar que `sys.argv` siempre exista y nunca esté vacío.

    Valor predeterminado: `NULL`.

    Consulte también el miembro `orig_argv`.

  int safe_path

    Si es igual a cero, `Py_RunMain()` agrega una ruta potencialmente insegura a `sys.path` al inicio:

    - Si `argv[0]` es igual a `L"-m"` (`python -m module`), añade el directorio de trabajo actual.

    - Si se ejecuta un script (`python script.py`), anteponer el directorio del script. Si es un enlace simbólico, resuelve los enlaces simbólicos.

    - En caso contrario (`python -c code` and `python`), añade una cadena vacía, que significa el directorio de trabajo actual.

    Establecido en `1` por la opción de la línea de comandos `-P` y la variable de entorno `PYTHONSAFEPATH`.

    Predeterminado: `0` en la configuración de Python, `1` en la configuración aislada.

    Added in version 3.11.

  wchar_t *base_exec_prefix

    `sys.base_exec_prefix`.

    Valor predeterminado: `NULL`.

    Parte de la salida Python Path Configuration.

    Consulte también `PyConfig.exec_prefix`.

  wchar_t *base_executable

    Python base executable: `sys._base_executable`.

    Set by the `__PYVENV_LAUNCHER__` environment variable.

    Establecido desde `PyConfig.executable` si `NULL`.

    Valor predeterminado: `NULL`.

    Parte de la salida Python Path Configuration.

    Consulte también `PyConfig.executable`.

  wchar_t *base_prefix

    `sys.base_prefix`.

    Valor predeterminado: `NULL`.

    Parte de la salida Python Path Configuration.

    Consulte también `PyConfig.prefix`.

  int buffered_stdio

    Si es igual a `0` y `configure_c_stdio` no es cero, deshabilite el almacenamiento en búfer en las secuencias C stdout y stderr.

    Establecido en `0` por la opción de línea de comando `-u` y la variable de entorno `PYTHONUNBUFFERED`.

    stdin siempre se abre en modo de búfer.

    Predeterminado: `1`.

  int bytes_warning

    Si es igual a `1`, emite una advertencia al comparar `bytes` o `bytearray` con `str`, o al comparar `bytes` con `int`.

    Si es igual o mayor a `2`, lanza una excepción `BytesWarning` en estos casos.

    Incrementado por la opción de línea de comando `-b`.

    Predeterminado: `0`.

    Deprecated since version 3.15, will be removed in version 3.17: The `-b` and `-bb` options will become no-op in 3.17. `bytes_warning` member will be removed in 3.17.

  int warn_default_encoding

    Si no es cero, emite una advertencia `EncodingWarning` cuando `io.TextIOWrapper` usa su codificación predeterminada. Consulte EncodingWarning opcional para obtener más detalles.

    Predeterminado: `0`.

    Added in version 3.10.

  int code_debug_ranges

    Si es igual a `0`, desactiva la inclusión de la línea final y las asignaciones de columna en los objetos de código. También desactiva la impresión de indicadores de rastreo a ubicaciones de error específicas.

    Establecido en `0` por la variable de entorno `PYTHONNODEBUGRANGES` y por la opción de línea de comando `-X no_debug_ranges`.

    Predeterminado: `1`.

    Added in version 3.11.

  wchar_t *check_hash_pycs_mode

    Controla el comportamiento de validación de archivos `.pyc` basados en hash: valor de la opción de línea de comando `--check-hash-based-pycs`.

    Valores válidos:

    - `L"always"`: Calcula el hash el archivo fuente para invalidación independientemente del valor de la marca “check_source”.

    - `L"never"`: suponga que los pycs basados en hash siempre son válidos.

    - `L"default"`: El indicador “check_source” en pycs basados en hash determina la invalidación.

    Predeterminado: `L"default"`.

    Consulte también PEP 552 «Pycs deterministas».

  int configure_c_stdio

    Si es distinto de cero, configure los flujos estándar de C:

    - En Windows, configure el modo binario (`O_BINARY`) en stdin, stdout y stderr.

    - Si `buffered_stdio` es igual a cero, deshabilite el almacenamiento en búfer de los flujos stdin, stdout y stderr.

    - Si `interactive` no es cero, habilite el almacenamiento en búfer de flujo en stdin y stdout (solo stdout en Windows).

    Predeterminado: `1` en la configuración de Python, `0` en la configuración aislada.

  int dev_mode

    Si es distinto de cero, habilita Modo de desarrollo de Python.

    Establecido en `1` por la opción `-X dev` y la variable de entorno `PYTHONDEVMODE`.

    Por defecto: `-1` en modo Python, `0` en modo aislado.

  int dump_refs

    ¿Volcar referencias de Python?

    Si no es cero, volcar todos los objetos que aún están vivos en la salida.

    Establecido en `1` por la variable de entorno `PYTHONDUMPREFS`.

    Necesita una compilación especial de Python con la macro `Py_TRACE_REFS` definida: consulte la opción `configure --with-trace-refs`.

    Predeterminado: `0`.

  wchar_t *dump_refs_file

    Filename where to dump Python references.

    Set by the `PYTHONDUMPREFSFILE` environment variable.

    Valor predeterminado: `NULL`.

    Added in version 3.11.

  wchar_t *exec_prefix

    El prefijo de directorio específico del sitio donde se instalan los archivos Python dependientes de la plataforma: `sys.exec_prefix`.

    Valor predeterminado: `NULL`.

    Parte de la salida Python Path Configuration.

    Consulte también `PyConfig.base_exec_prefix`.

  wchar_t *executable

    La ruta absoluta del binario ejecutable para el intérprete de Python: `sys.executable`.

    Valor predeterminado: `NULL`.

    Parte de la salida Python Path Configuration.

    Consulte también `PyConfig.base_executable`.

  int faulthandler

    ¿Habilitar administrador de fallas?

    Si no es cero, llama a `faulthandler.enable()` al inicio.

    Establecido en `1` por `-X faulthandler` y la variable de entorno `PYTHONFAULTHANDLER`.

    Por defecto: `-1` en modo Python, `0` en modo aislado.

  wchar_t *filesystem_encoding

    Codificación del sistema de archvios: `sys.getfilesystemencoding()`.

    En macOS, Android y VxWorks: use `"utf-8"` de forma predeterminada.

    En Windows: utilice `"utf-8"` de forma predeterminada o `"mbcs"` si `legacy_windows_fs_encoding` de `PyPreConfig` no es cero.

    Codificación predeterminada en otras plataformas:

    - `"utf-8"` si `PyPreConfig.utf8_mode` es distinto de cero.

    - `"ascii"` si Python detecta que `nl_langinfo(CODESET)` anuncia la codificación ASCII, mientras que la función `mbstowcs()` decodifica desde una codificación diferente (usualmente Latin1).

    - `"utf-8"` si `nl_langinfo(CODESET)` retorna una cadena vacía.

    - De lo contrario, utilice el resultado locale encoding: `nl_langinfo(CODESET)`.

    Al inicio de Python, el nombre de codificación se normaliza al nombre del códec de Python. Por ejemplo, `"ANSI_X3.4-1968"` se reemplaza por `"ascii"`.

    Consulte también el miembro `filesystem_errors`.

  wchar_t *filesystem_errors

    Manejador de errores del sistema de archivos: `sys.getfilesystemencodeerrors()`.

    En Windows: utilice `"surrogatepass"` de forma predeterminada o `"replace"` si `legacy_windows_fs_encoding` de `PyPreConfig` no es cero.

    En otras plataformas: utilice `"surrogateescape"` de forma predeterminada.

    Controladores de errores admitidos:

    - `"strict"`

    - `"surrogateescape"`

    - `"surrogatepass"` (solo compatible con la codificación UTF-8)

    Consulte también el miembro `filesystem_encoding`.

  int use_frozen_modules

    If non-zero, use frozen modules.

    Set by the `PYTHON_FROZEN_MODULES` environment variable.

    Default: `1` in a release build, or `0` in a debug build.

  unsigned long hash_seed
  int use_hash_seed

    Funciones de semillas aleatorias hash.

    Si `use_hash_seed` es cero, se elige una semilla al azar en el inicio de Python y se ignora `hash_seed`.

    Establecido por la variable de entorno `PYTHONHASHSEED`.

    Valor predeterminado de use_hash_seed: `-1` en modo Python, `0` en modo aislado.

  wchar_t *home

    Establece el directorio «home» de Python por defecto, es decir, la ubicación de las bibliotecas estándar de Python (ver `PYTHONHOME`).

    Establecido por la variable de entorno `PYTHONHOME`.

    Valor predeterminado: `NULL`.

    Parte de la entrada Python Path Configuration.

  int import_time

    > If `1`, profile import time. If `2`, include additional output that indicates when an imported module has already been loaded.

    > Set by the `-X importtime` option and the `PYTHONPROFILEIMPORTTIME` environment variable.

    > Predeterminado: `0`.

    Distinto en la versión 3.14: Added support for `import_time = 2`

  int inspect

    Ingresa al modo interactivo después de ejecutar un script o un comando.

    Si es mayor que `0`, habilite la inspección: cuando se pasa un script como primer argumento o se usa la opción -c, ingrese al modo interactivo después de ejecutar el script o el comando, incluso cuando `sys.stdin` no parezca ser una terminal.

    Incrementado por la opción de línea de comando `-i`. Establecido en `1` si la variable de entorno `PYTHONINSPECT` no está vacía.

    Predeterminado: `0`.

  int install_signal_handlers

    ¿Instalar controladores de señales de Python?

    Por defecto: `1` en modo Python, `0` en modo aislado.

  int interactive

    Si es mayor que `0`, habilita el modo interactivo (REPL).

    Incrementado por la opción de línea de comando `-i`.

    Predeterminado: `0`.

  int int_max_str_digits

    Configura la limitación de la longitud de conversión de entero a cadena. Un valor inicial de `-1` significa que el valor se tomará de la línea de comandos o del entorno o, de lo contrario, será por defecto 4300 (`sys.int_info.default_max_str_digits`). Un valor de `0` deshabilita la limitación. Los valores mayores que cero pero menores que 640 (`sys.int_info.str_digits_check_threshold`) no son compatibles y producirán un error.

    Configurado por la bandera de línea de comandos `-X int_max_str_digits` o la variable de entorno `PYTHONINTMAXSTRDIGITS`.

    Predeterminado: `-1` en modo Python. 4300 (`sys.int_info.default_max_str_digits`) en modo aislado.

    Added in version 3.12.

  int cpu_count

    Si el valor de `cpu_count` no es `-1`, entonces anulará los valores de retorno de `os.cpu_count()`, `os.process_cpu_count()` y `multiprocessing.cpu_count()`.

    Configurado por la bandera de línea de comandos `-X cpu_count=n|default` o la variable de entorno `PYTHON_CPU_COUNT`.

    Predeterminado: `-1`.

    Added in version 3.13.

  int isolated

    Si es mayor que `0`, habilite el modo aislado:

    - Establezca `safe_path` en `1`: no anteponga una ruta potencialmente insegura a `sys.path` al inicio de Python, como el directorio actual, el directorio del script o una cadena vacía.

    - Establezca `use_environment` en `0`: ignore las variables de entorno `PYTHON`.

    - Establezca `user_site_directory` en `0`: no agregue el directorio del sitio del usuario a `sys.path`.

    - Python REPL no importa `readline` ni habilita la configuración predeterminada de readline en mensajes interactivos.

    Establecido en `1` por la opción de línea de comando `-I`.

    Por defecto: `0` en modo Python, `1` en modo aislado.

    Consulte también la Configuración Aislada y `PyPreConfig.isolated`.

  int legacy_windows_stdio

    Si no es cero, use `io.FileIO` en lugar de `io._WindowsConsoleIO` para `sys.stdin`, `sys.stdout` y `sys.stderr`.

    Establecido en `1` si la variable de entorno `PYTHONLEGACYWINDOWSSTDIO` está establecida en una cadena no vacía.

    Solo disponible en Windows. La macro `#ifdef MS_WINDOWS` se puede usar para el código específico de Windows.

    Predeterminado: `0`.

    Consulte también PEP 528 (Cambiar la codificación de la consola de Windows a UTF-8).

  int malloc_stats

    Si no es cero, volcar las estadísticas en Asignador de memoria Python pymalloc en la salida.

    Establecido en `1` por la variable de entorno `PYTHONMALLOCSTATS`.

    La opción se ignora si Python es `configurado usando la opción --without-pymalloc`.

    Predeterminado: `0`.

  wchar_t *platlibdir

    Nombre del directorio de la biblioteca de la plataforma: `sys.platlibdir`.

    Establecido por la variable de entorno `PYTHONPLATLIBDIR`.

    Predeterminado: valor de la macro `PLATLIBDIR` que se establece mediante la opción `configure --with-platlibdir` (predeterminado: `"lib"`, o `"DLLs"` en Windows).

    Parte de la entrada Python Path Configuration.

    Added in version 3.9.

    Distinto en la versión 3.11: Esta macro se utiliza ahora en Windows para localizar los módulos de extensión de la biblioteca estándar, normalmente en `DLLs`. Sin embargo, por compatibilidad, tenga en cuenta que este valor se ignora para cualquier disposición no estándar, incluyendo las construcciones dentro del árbol y los entornos virtuales.

  wchar_t *pythonpath_env

    Rutas de búsqueda de módulos (`sys.path`) como una cadena separada por `DELIM` (`os.pathsep`).

    Establecido por la variable de entorno `PYTHONPATH`.

    Valor predeterminado: `NULL`.

    Parte de la entrada Python Path Configuration.

  PyWideStringList module_search_paths
  int module_search_paths_set

    Rutas de búsqueda del módulo: `sys.path`.

    Si `module_search_paths_set` es igual a `0`, `Py_InitializeFromConfig()` reemplazará `module_search_paths` y establecerá `module_search_paths_set` en `1`.

    Por defecto: lista vacía (`module_search_paths`) y `0` (`module_search_paths_set`).

    Parte de la salida Python Path Configuration.

  int optimization_level

    Nivel de optimización de compilación:

    - `0`: Optimizador de mirilla, configure `__debug__` en `True`.

    - `1`: Nivel 0, elimina las aserciones, establece `__debug__` en `False`.

    - `2`: Nivel 1, elimina docstrings.

    Incrementado por la opción de línea de comando `-O`. Establecido en el valor de la variable de entorno `PYTHONOPTIMIZE`.

    Predeterminado: `0`.

  PyWideStringList orig_argv

    La lista de los argumentos originales de la línea de comandos pasados al ejecutable de Python: `sys.orig_argv`.

    Si la lista `orig_argv` está vacía y `argv` no es una lista que solo contiene una cadena vacía, `PyConfig_Read()` copia `argv` en `orig_argv` antes de modificar `argv` (si `parse_argv` no es cero).

    Consulte también el miembro `argv` y la función `Py_GetArgcArgv()`.

    Predeterminado: lista vacía.

    Added in version 3.10.

  int parse_argv

    ¿Analizar los argumentos de la línea de comando?

    Si es igual a `1`, analiza `argv` de la misma forma que Python normal analiza argumentos de línea de comando y elimina los argumentos de Python de `argv`.

    La función `PyConfig_Read()` solo analiza los argumentos `PyConfig.argv` una vez: `PyConfig.parse_argv` se establece en `2` después de que se analizan los argumentos. Como los argumentos de Python se eliminan de `PyConfig.argv`, analizar los argumentos dos veces analizaría las opciones de la aplicación como opciones de Python.

    Por defecto: `1` en modo Python, `0` en modo aislado.

    Distinto en la versión 3.10: Los argumentos `PyConfig.argv` ahora solo se analizan si `PyConfig.parse_argv` es igual a `1`.

  int parser_debug

    Modo de depuración del analizador. Si es mayor que `0`, active la salida de depuración del analizador (solo para expertos, dependiendo de las opciones de compilación).

    Incrementado por la opción de línea de comando `-d`. Establecido en el valor de la variable de entorno `PYTHONDEBUG`.

    Necesita una compilación de depuración de Python (se debe definir la macro `Py_DEBUG`).

    Predeterminado: `0`.

  int pathconfig_warnings

    Si no es cero, se permite que el cálculo de la configuración de ruta registre advertencias en `stderr`. Si es igual a `0`, suprima estas advertencias.

    Por defecto: `1` en modo Python, `0` en modo aislado.

    Parte de la entrada Python Path Configuration.

    Distinto en la versión 3.11: Ahora también se aplica en Windows.

  wchar_t *prefix

    El prefijo de directorio específico del sitio donde se instalan los archivos Python independientes de la plataforma: `sys.prefix`.

    Valor predeterminado: `NULL`.

    Parte de la salida Python Path Configuration.

    Consulte también `PyConfig.base_prefix`.

  wchar_t *program_name

    Nombre del programa utilizado para inicializar `executable` y en los primeros mensajes de error durante la inicialización de Python.

    - En macOS, usa la variable de entorno `PYTHONEXECUTABLE` si está configurada.

    - If the `WITH_NEXT_FRAMEWORK` macro is defined, use `__PYVENV_LAUNCHER__` environment variable if set.

    - Utiliza `argv[0]` de `argv` si está disponible y no está vacío.

    - De lo contrario, utiliza `L"python"` en Windows o `L"python3"` en otras plataformas.

    Valor predeterminado: `NULL`.

    Parte de la entrada Python Path Configuration.

  wchar_t *pycache_prefix

    Directorio donde se escriben los archivos `.pyc` almacenados en caché: `sys.pycache_prefix`.

    Establecido por la opción de línea de comando `-X pycache_prefix=PATH` y la variable de entorno `PYTHONPYCACHEPREFIX`. La opción de línea de comandos tiene prioridad.

    Si `NULL`, `sys.pycache_prefix` es establecido a `None`.

    Valor predeterminado: `NULL`.

  int quiet

    Modo silencioso. Si es mayor que `0`, no muestre los derechos de autor y la versión al inicio de Python en modo interactivo.

    Incrementado por la opción de línea de comando `-q`.

    Predeterminado: `0`.

  wchar_t *run_command

    Valor de la opción de línea de comando `-c`.

    Usado por `Py_RunMain()`.

    Valor predeterminado: `NULL`.

  wchar_t *run_filename

    Nombre de archivo pasado en la línea de comandos: argumento final de la línea de comandos sin `-c` o `-m`. Es utilizado por la función `Py_RunMain()`.

    Por ejemplo, se establece en `script.py` mediante la línea de comandos `python3 script.py arg`.

    Consulte también la opción `PyConfig.skip_source_first_line`.

    Valor predeterminado: `NULL`.

  wchar_t *run_module

    Valor de la opción de línea de comando `-m`.

    Usado por `Py_RunMain()`.

    Valor predeterminado: `NULL`.

  wchar_t *run_presite

    `module` or `module:func` entry point that should be executed before the `site` module is imported.

    Set by the `-X presite=module:func` command-line option and the `PYTHON_PRESITE` environment variable. The command-line option takes precedence.

    Necesita una compilación de depuración de Python (se debe definir la macro `Py_DEBUG`).

    Valor predeterminado: `NULL`.

  int show_ref_count

    ¿Mostrar el recuento total de referencias al salir (excluyendo objetos immortal)?

    Establecido en `1` por la opción de línea de comando `-X showrefcount`.

    Necesita una compilación de depuración de Python (la macro `Py_REF_DEBUG` debe estar definida).

    Predeterminado: `0`.

  int site_import

    ¿Importar el módulo `site` al inicio?

    Si es igual a cero, desactive la importación del sitio del módulo y las manipulaciones dependientes del sitio de `sys.path` que conlleva.

    También deshabilite estas manipulaciones si el módulo `site` se importa explícitamente más tarde (llame a `site.main()` si desea que se activen).

    Establecido en `0` mediante la opción de línea de comando `-S`.

    `sys.flags.no_site` se establece en el valor invertido de `site_import`.

    Predeterminado: `1`.

  int skip_source_first_line

    Si no es cero, omita la primera línea de la fuente `PyConfig.run_filename`.

    Permite el uso de formas de `#!cmd` que no son Unix. Esto está destinado únicamente a un truco específico de DOS.

    Establecido en `1` mediante la opción de línea de comando `-x`.

    Predeterminado: `0`.

  wchar_t *stdio_encoding
  wchar_t *stdio_errors

    Codificación y errores de codificación de `sys.stdin`, `sys.stdout` y `sys.stderr` (pero `sys.stderr` siempre usa el controlador de errores `"backslashreplace"`).

    Utilice la variable de entorno `PYTHONIOENCODING` si no está vacía.

    Codificación predeterminada:

    - `"UTF-8"` si `PyPreConfig.utf8_mode` es distinto de cero.

    - De lo contrario, usa el locale encoding.

    Manejador de errores predeterminado:

    - En Windows: use `"surrogateescape"`.

    - `"surrogateescape"` si `PyPreConfig.utf8_mode` no es cero o si la configuración regional LC_CTYPE es «C» o «POSIX».

    - `"strict"` de lo contrario.

    Consulte también `PyConfig.legacy_windows_stdio`.

  int tracemalloc

    ¿Habilitar tracemalloc?

    Si no es cero, llama a `tracemalloc.start()` al inicio.

    Establecido por la opción de línea de comando `-X tracemalloc=N` y por la variable de entorno `PYTHONTRACEMALLOC`.

    Por defecto: `-1` en modo Python, `0` en modo aislado.

  int perf_profiling

    Enable the Linux `perf` profiler support?

    If equals to `1`, enable support for the Linux `perf` profiler.

    If equals to `2`, enable support for the Linux `perf` profiler with DWARF JIT support.

    Set to `1` by `-X perf` command-line option and the `PYTHONPERFSUPPORT` environment variable.

    Set to `2` by the `-X perf_jit` command-line option and the `PYTHON_PERF_JIT_SUPPORT` environment variable.

    Predeterminado: `-1`.

    Ver también

    See Python support for the perf map compatible profilers for more information.

    Added in version 3.12.

  wchar_t *stdlib_dir

    Directory of the Python standard library.

    Valor predeterminado: `NULL`.

    Added in version 3.11.

  int use_environment

    ¿Utiliza variables de entorno?

    Si es igual a cero, ignora las variables de entorno.

    Establecido en `0` por la variable de entorno `-E`.

    Predeterminado: `1` en la configuración de Python y `0` en la configuración aislada.

  int use_system_logger

    If non-zero, `stdout` and `stderr` will be redirected to the system log.

    Only available on macOS 10.12 and later, and on iOS.

    Default: `0` (don’t use the system log) on macOS; `1` on iOS (use the system log).

    Added in version 3.14.

  int user_site_directory

    Si es distinto de cero, agregue el directorio del sitio del usuario a `sys.path`.

    Establecido en `0` por las opciones de línea de comando `-s` y `-I`.

    Establecido en `0` por la variable de entorno `PYTHONNOUSERSITE`.

    Por defecto: `1` en modo Python, `0` en modo aislado.

  int verbose

    Modo detallado. Si es mayor que `0`, imprime un mensaje cada vez que se importa un módulo, mostrando el lugar (nombre de archivo o módulo incorporado) desde el que se carga.

    Si es mayor o igual a `2`, imprime un mensaje para cada archivo que se verifica al buscar un módulo. También proporciona información sobre la limpieza del módulo al salir.

    Incrementado por la opción de línea de comando `-v`.

    Establecido por el valor de la variable de entorno `PYTHONVERBOSE`.

    Predeterminado: `0`.

  PyWideStringList warnoptions

    Opciones del módulo `warnings` para crear filtros de advertencias, de menor a mayor prioridad: `sys.warnoptions`.

    The `warnings` module adds `sys.warnoptions` in the reverse order: the last `PyConfig.warnoptions` item becomes the first item of `warnings.filters` which is checked first (highest priority).

    Las opciones de la línea de comando `-W` agregan su valor a `warnoptions`, se puede usar varias veces.

    La variable de entorno `PYTHONWARNINGS` también se puede utilizar para agregar opciones de advertencia. Se pueden especificar varias opciones, separadas por comas (`,`).

    Predeterminado: lista vacía.

  int write_bytecode

    Si es igual a `0`, Python no intentará escribir archivos `.pyc` al importar módulos fuente.

    Establecido en `0` por la opción de línea de comando `-B` y la variable de entorno `PYTHONDONTWRITEBYTECODE`.

    `sys.dont_write_bytecode` se inicializa al valor invertido de `write_bytecode`.

    Predeterminado: `1`.

  PyWideStringList xoptions

    Valores de las opciones de la línea de comando `-X`: `sys._xoptions`.

    Predeterminado: lista vacía.

  int _pystats

    If non-zero, write performance statistics at Python exit.

    Need a special build with the `Py_STATS` macro: see `--enable-pystats`.

    Predeterminado: `0`.

Si `parse_argv` no es cero, los argumentos de `argv` se analizan de la misma forma que Python normal analiza argumentos de línea de comando, y los argumentos de Python se eliminan de `argv`.

Las opciones de `xoptions` se analizan para establecer otras opciones: consulte la opción de línea de comando `-X`.

Distinto en la versión 3.9: El campo `show_alloc_count` fue removido.

### Inicialización con PyConfig

Initializing the interpreter from a populated configuration struct is handled by calling `Py_InitializeFromConfig()`.

La persona que llama es responsable de manejar las excepciones (error o salida) usando `PyStatus_Exception()` y `Py_ExitStatusException()`.

Si se utilizan `PyImport_FrozenModules()`, `PyImport_AppendInittab()` o `PyImport_ExtendInittab()`, deben establecerse o llamarse después de la preinicialización de Python y antes de la inicialización de Python. Si Python se inicializa varias veces, se debe llamar a `PyImport_AppendInittab()` o `PyImport_ExtendInittab()` antes de cada inicialización de Python.

La configuración actual (tipo `PyConfig`) se almacena en `PyInterpreterState.config`.

Ejemplo de configuración del nombre del programa:

    void init_python(void)
    {
        PyStatus status;

        PyConfig config;
        PyConfig_InitPythonConfig(&config);

        /* Set the program name. Implicitly preinitialize Python. */
        status = PyConfig_SetString(&config, &config.program_name,
                                    L"/path/to/my_program");
        if (PyStatus_Exception(status)) {
            goto exception;
        }

        status = Py_InitializeFromConfig(&config);
        if (PyStatus_Exception(status)) {
            goto exception;
        }
        PyConfig_Clear(&config);
        return;

    exception:
        PyConfig_Clear(&config);
        Py_ExitStatusException(status);
    }

Ejemplo más completo modificando la configuración predeterminada, lee la configuración y luego anula algunos parámetros. Ten en cuenta que, desde la versión 3.11, muchos parámetros no se calculan hasta la inicialización, por lo que los valores no se pueden leer desde la estructura de configuración. Cualquier valor establecido antes de llamar a la inicialización se dejará sin cambios por la inicialización:

    PyStatus init_python(const char *program_name)
    {
        PyStatus status;

        PyConfig config;
        PyConfig_InitPythonConfig(&config);

        /* Set the program name before reading the configuration
           (decode byte string from the locale encoding).

           Implicitly preinitialize Python. */
        status = PyConfig_SetBytesString(&config, &config.program_name,
                                         program_name);
        if (PyStatus_Exception(status)) {
            goto done;
        }

        /* Read all configuration at once */
        status = PyConfig_Read(&config);
        if (PyStatus_Exception(status)) {
            goto done;
        }

        /* Specify sys.path explicitly */
        /* If you want to modify the default set of paths, finish
           initialization first and then use PySys_GetAttrString("path") */
        config.module_search_paths_set = 1;
        status = PyWideStringList_Append(&config.module_search_paths,
                                         L"/path/to/stdlib");
        if (PyStatus_Exception(status)) {
            goto done;
        }
        status = PyWideStringList_Append(&config.module_search_paths,
                                         L"/path/to/more/modules");
        if (PyStatus_Exception(status)) {
            goto done;
        }

        /* Override executable computed by PyConfig_Read() */
        status = PyConfig_SetString(&config, &config.executable,
                                    L"/path/to/my_executable");
        if (PyStatus_Exception(status)) {
            goto done;
        }

        status = Py_InitializeFromConfig(&config);

    done:
        PyConfig_Clear(&config);
        return status;
    }

### Configuración aislada

`PyPreConfig_InitIsolatedConfig()` y las funciones `PyConfig_InitIsolatedConfig()` crean una configuración para aislar Python del sistema. Por ejemplo, para incrustar Python en una aplicación.

Esta configuración ignora las variables de configuración global, las variables de entorno, los argumentos de la línea de comandos (`PyConfig.argv` no se analizan) y el directorio del sitio del usuario. Los flujos estándar de C (por ejemplo, `stdout`) y la configuración regional LC_CTYPE no se modifican. Los manejadores de señales no están instalados.

Los archivos de configuración se siguen utilizando con esta configuración para determinar las rutas que no se especifican. Asegúrese de que se especifica `PyConfig.home` para evitar que se calcule la configuración de la ruta por defecto.

### Configuración de Python

`PyPreConfig_InitPythonConfig()` y las funciones `PyConfig_InitPythonConfig()` crean una configuración para construir un Python personalizado que se comporta como el Python normal.

Las variables de entorno y los argumentos de la línea de comandos se utilizan para configurar Python, mientras que las variables de configuración global se ignoran.

Esta función habilita la coerción de configuración regional C (PEP 538) y Python UTF-8 Mode (PEP 540) según la configuración regional LC_CTYPE, las variables de entorno `PYTHONUTF8` y `PYTHONCOERCECLOCALE`.

### Configuración de la ruta de Python

`PyConfig` contiene múltiples campos para la configuración de ruta:

- Entradas de configuración de ruta:

  - `PyConfig.home`

  - `PyConfig.platlibdir`

  - `PyConfig.pathconfig_warnings`

  - `PyConfig.program_name`

  - `PyConfig.pythonpath_env`

  - directorio de trabajo actual: para obtener rutas absolutas

  - Variable de entorno `PATH` para obtener la ruta completa del programa (de `PyConfig.program_name`)

  - Variable de entorno `__PYVENV_LAUNCHER__`

  - (Solo Windows) Rutas de aplicación en el registro en «SoftwarePythonPythonCoreX.YPythonPath» de HKEY_CURRENT_USER y HKEY_LOCAL_MACHINE (donde X.Y es la versión de Python).

- Campos de salida de configuración de ruta:

  - `PyConfig.base_exec_prefix`

  - `PyConfig.base_executable`

  - `PyConfig.base_prefix`

  - `PyConfig.exec_prefix`

  - `PyConfig.executable`

  - `PyConfig.module_search_paths_set`, `PyConfig.module_search_paths`

  - `PyConfig.prefix`

Si al menos un «campo de salida» no está establecido, Python calcula la configuración de la ruta para rellenar los campos no establecidos. Si `module_search_paths_set` es igual a `0`, `module_search_paths` se anula y `module_search_paths_set` se establece en `1`.

Es posible ignorar completamente la función que calcula la configuración de ruta predeterminada estableciendo explícitamente todos los campos de salida de configuración de ruta mencionados anteriormente. Una cadena se considera establecida incluso si no está vacía. `module_search_paths` se considera establecido si `module_search_paths_set` se establece en `1`. En este caso, `module_search_paths` se utilizará sin modificaciones.

Establezca `pathconfig_warnings` en `0` para suprimir las advertencias al calcular la configuración de la ruta (solo Unix, Windows no registra ninguna advertencia).

Si `base_prefix` o los campos `base_exec_prefix` no están establecidos, heredan su valor de `prefix` y `exec_prefix` respectivamente.

`Py_RunMain()` y `Py_Main()` modifican `sys.path`:

- Si `run_filename` está configurado y es un directorio que contiene un script `__main__.py`, anteponga `run_filename` a `sys.path`.

- Si `isolated` es cero:

  - Si `run_module` está configurado, anteponga el directorio actual a `sys.path`. No haga nada si el directorio actual no se puede leer.

  - Si `run_filename` está configurado, anteponga el directorio del nombre del archivo a `sys.path`.

  - De lo contrario, anteponga una cadena de caracteres vacía a `sys.path`.

Si `site_import` no es cero, `sys.path` puede ser modificado por el módulo `site`. Si `user_site_directory` no es cero y el directorio del paquete del sitio del usuario existe, el módulo `site` agrega el directorio del paquete del sitio del usuario a `sys.path`.

La configuración de ruta utiliza los siguientes archivos de configuración:

- `pyvenv.cfg`

- archivo `._pth` (ej: `python._pth`)

- `pybuilddir.txt` (sólo Unix)

Si un archivo `._pth` está presente:

- Establezca `isolated` en `1`.

- Establezca `use_environment` en `0`.

- Establezca `site_import` en `0`.

- Set `user_site_directory` to `0` (since 3.15).

- Establezca `safe_path` en `1`.

If `home` is not set and a `pyvenv.cfg` file is present in the same directory as `executable`, or its parent, `prefix` and `exec_prefix` are set that location. When this happens, `base_prefix` and `base_exec_prefix` still keep their value, pointing to the base installation. See Virtual Environments for more information.

La variable de entorno `__PYVENV_LAUNCHER__` se usa para establecer `PyConfig.base_executable`.

Distinto en la versión 3.14: `prefix`, and `exec_prefix`, are now set to the `pyvenv.cfg` directory. This was previously done by `site`, therefore affected by `-S`.

Distinto en la versión 3.15: `user_site_directory` is now set to `0` when a `._pth` file is present.

## Py_GetArgcArgv()

void Py_GetArgcArgv(int *argc, wchar_t ***argv)

  Obtiene los argumentos originales de la línea de comandos, antes de que Python los modificara.

  Ver también el miembro `PyConfig.orig_argv`.

## Multi-Phase Initialization Private Provisional API

This section is a private provisional API introducing multi-phase initialization, the core feature of PEP 432:

- «Core» initialization phase, «bare minimum Python»:

  - Builtin types;

  - Builtin exceptions;

  - Builtin and frozen modules;

  - The `sys` module is only partially initialized (ex: `sys.path` doesn’t exist yet).

- «Main» initialization phase, Python is fully initialized:

  - Install and configure `importlib`;

  - Apply the Path Configuration;

  - Install signal handlers;

  - Finish `sys` module initialization (ex: create `sys.stdout` and `sys.path`);

  - Enable optional features like `faulthandler` and `tracemalloc`;

  - Import the `site` module;

  - etc.

Private provisional API:

int PyConfig._init_main

  If set to `0`, `Py_InitializeFromConfig()` stops at the «Core» initialization phase.

PyStatus _Py_InitializeMain(void)

  Move to the «Main» initialization phase, finish the Python initialization.

No module is imported during the «Core» phase and the `importlib` module is not configured: the Path Configuration is only applied during the «Main» phase. It may allow to customize Python in Python to override or tune the Path Configuration, maybe install a custom `sys.meta_path` importer or an import hook, etc.

It may become possible to calculate the Path Configuration in Python, after the Core phase and before the Main phase, which is one of the PEP 432 motivation.

The «Core» phase is not properly defined: what should be and what should not be available at this phase is not specified yet. The API is marked as private and provisional: the API can be modified or even be removed anytime until a proper public API is designed.

Example running Python code between «Core» and «Main» initialization phases:

    void init_python(void)
    {
        PyStatus status;

        PyConfig config;
        PyConfig_InitPythonConfig(&config);
        config._init_main = 0;

        /* ... customize 'config' configuration ... */

        status = Py_InitializeFromConfig(&config);
        PyConfig_Clear(&config);
        if (PyStatus_Exception(status)) {
            Py_ExitStatusException(status);
        }

        /* Use sys.stderr because sys.stdout is only created
           by _Py_InitializeMain() */
        int res = PyRun_SimpleString(
            "import sys; "
            "print('Run Python code before _Py_InitializeMain', "
                   "file=sys.stderr)");
        if (res < 0) {
            exit(1);
        }

        /* ... put more configuration code here ... */

        status = _Py_InitializeMain();
        if (PyStatus_Exception(status)) {
            Py_ExitStatusException(status);
        }
    }