> **Источник:** https://python-all.ru/3.10/c-api/init_config.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Конфигурация инициализации Python

Новое в версии 3.8.

Python может быть инициализирован с помощью [`Py_InitializeFromConfig()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_InitializeFromConfig) и структуры [`PyConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig). Он может быть предварительно инициализирован с помощью [`Py_PreInitialize()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_PreInitialize) и структуры [`PyPreConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig).

Существует два вида конфигурации:

- [Конфигурация Python](https://python-all.ru/3.10/c-api/init_config.html#init-python-config) может использоваться для создания настраиваемого Python, который ведёт себя как обычный Python. Например, переменные окружения и аргументы командной строки используются для настройки Python.
- [Изолированная конфигурация](https://python-all.ru/3.10/c-api/init_config.html#init-isolated-conf) может использоваться для встраивания Python в приложение. Она изолирует Python от системы. Например, переменные окружения игнорируются, локаль LC\_CTYPE остаётся неизменной и не регистрируется ни один обработчик сигналов.

Функция [`Py_RunMain()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_RunMain) может использоваться для написания настраиваемой программы на Python.

См. также [Инициализация, финализация и потоки](https://python-all.ru/3.10/c-api/init.html#initialization).

> **См. также**
>
> [**PEP 587**](https://python-all.ru/3.10/c-api/init_config.html) “Конфигурация инициализации Python”.

## Пример

Пример настройки Python для постоянной работы в изолированном режиме:

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

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

    /* Декодировать аргументы командной строки.
       Неявно предварительно инициализировать Python (в изолированном режиме). */
    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;
    }
    /* Вывести сообщение об ошибке и завершить процесс с
       ненулевым кодом выхода */
    Py_ExitStatusException(status);
}
```

## PyWideStringList

#### `type PyWideStringList`

Список строк `wchar_t*`.

Если *length* не равно нулю, *items* должен быть не `NULL`, а все строки должны быть\\nне `NULL`.

Методы:

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

Добавляет *item* в *list*.

Для вызова этой функции Python должен быть предварительно инициализирован.

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

Вставляет *item* в *list* по индексу *index*.

Если *index* больше или равен длине *list*, добавляет *item* в\\n*list*.

*index* должен быть больше или равен 0.

Для вызова этой функции Python должен быть предварительно инициализирован.

Поля структуры:

#### `Py_ssize_t length`

Длина списка.

#### `wchar_t **items`

Элементы списка.

## PyStatus

#### `type PyStatus`

Структура для хранения состояния функции инициализации: успех, ошибка\\nили завершение.

В случае ошибки может хранить имя C-функции, вызвавшей ошибку.

Поля структуры:

#### `int exitcode`

Код выхода. Аргумент, передаваемый в `exit()`.

#### `const char *err_msg`

Сообщение об ошибке.

#### `const char *func`

Имя функции, создавшей ошибку, может быть `NULL`.

Функции создания статуса:

#### `PyStatus PyStatus_Ok(void)`

Успех.

#### `PyStatus PyStatus_Error(const char *err_msg)`

Ошибка инициализации с сообщением.

*err\_msg* не должен быть `NULL`.

#### `PyStatus PyStatus_NoMemory(void)`

Сбой выделения памяти (не хватает памяти).

#### `PyStatus PyStatus_Exit(int exitcode)`

Завершить Python с указанным кодом выхода.

Функции обработки статуса:

#### `int PyStatus_Exception(PyStatus status)`

Является ли статус ошибкой или выходом? Если да, исключение должно быть обработано, например, вызовом [`Py_ExitStatusException()`](https://python-all.ru/3.10/c-api/init_config.html#c.PyStatus.Py_ExitStatusException).

#### `int PyStatus_IsError(PyStatus status)`

Является ли результат ошибкой?

#### `int PyStatus_IsExit(PyStatus status)`

Является ли результат выходом?

#### `void Py_ExitStatusException(PyStatus status)`

Вызвать `exit(exitcode)`, если *status* – это выход. Вывести сообщение об ошибке и завершиться с ненулевым кодом выхода, если *status* – это ошибка. Должна вызываться, только если `PyStatus_Exception(status)` не равен нулю.

> **Примечание**
>
> Внутренне Python использует макросы, которые устанавливают `PyStatus.func`, тогда как функции создания статуса устанавливают `func` в `NULL`.

Пример:

```c
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`

Структура, используемая для предварительной инициализации Python.

Функция инициализации предварительной конфигурации:

#### `void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)`

Инициализировать предварительную конфигурацию с [Конфигурацией Python](https://python-all.ru/3.10/c-api/init_config.html#init-python-config).

#### `void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)`

Инициализировать предварительную конфигурацию с [Изолированной конфигурацией](https://python-all.ru/3.10/c-api/init_config.html#init-isolated-conf).

Поля структуры:

#### `int allocator`

Имя распределителей памяти Python:

- `PYMEM_ALLOCATOR_NOT_SET` (`0`): не изменять распределители памяти (использовать значения по умолчанию).
- `PYMEM_ALLOCATOR_DEFAULT` (`1`): [стандартные распределители памяти](https://python-all.ru/3.10/c-api/memory.html#default-memory-allocators).
- `PYMEM_ALLOCATOR_DEBUG` (`2`): [стандартные распределители памяти](https://python-all.ru/3.10/c-api/memory.html#default-memory-allocators) с [отладочными перехватчиками](https://python-all.ru/3.10/c-api/memory.html#pymem-debug-hooks).
- `PYMEM_ALLOCATOR_MALLOC` (`3`): использовать `malloc()` из библиотеки C.
- `PYMEM_ALLOCATOR_MALLOC_DEBUG` (`4`): принудительно использовать `malloc()` с [отладочными перехватчиками](https://python-all.ru/3.10/c-api/memory.html#pymem-debug-hooks).
- `PYMEM_ALLOCATOR_PYMALLOC` (`5`): [распределитель памяти pymalloc из Python](https://python-all.ru/3.10/c-api/memory.html#pymalloc).
- `PYMEM_ALLOCATOR_PYMALLOC_DEBUG` (`6`): [распределитель памяти pymalloc из Python](https://python-all.ru/3.10/c-api/memory.html#pymalloc) с [отладочными перехватчиками](https://python-all.ru/3.10/c-api/memory.html#pymem-debug-hooks).

`PYMEM_ALLOCATOR_PYMALLOC` и `PYMEM_ALLOCATOR_PYMALLOC_DEBUG` не поддерживаются, если Python собран [`configured using --without-pymalloc`](https://python-all.ru/3.10/using/configure.html#cmdoption-without-pymalloc).

См. [Управление памятью](https://python-all.ru/3.10/c-api/memory.html#memory).

По умолчанию: `PYMEM_ALLOCATOR_NOT_SET`.

#### `int configure_locale`

Устанавливает локаль LC\_CTYPE в локаль, предпочитаемую пользователем.

Если равно 0, установите поля [`coerce_c_locale`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.coerce_c_locale) и [`coerce_c_locale_warn`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.coerce_c_locale_warn) в 0.

См. [кодировку локали](https://python-all.ru/3.10/glossary.html#term-locale-encoding).

По умолчанию: `1` в конфигурации Python, `0` в изолированной конфигурации.

#### `int coerce_c_locale`

Если равно 2, принудительно установить локаль C.

Если равно 1, прочитать локаль LC\_CTYPE, чтобы определить, требуется ли принудительная установка.

См. [кодировку локали](https://python-all.ru/3.10/glossary.html#term-locale-encoding).

По умолчанию: `-1` в конфигурации Python, `0` в изолированной конфигурации.

#### `int coerce_c_locale_warn`

Если не равно нулю, выводит предупреждение при принудительном переключении локали C.

По умолчанию: `-1` в конфигурации Python, `0` в изолированной конфигурации.

#### `int dev_mode`

Если не равно нулю, включает [Режим разработки Python](https://python-all.ru/3.10/library/devmode.html#devmode): см. [`PyConfig.dev_mode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.dev_mode).

По умолчанию: `-1` в режиме Python, `0` в изолированном режиме.

#### `int isolated`

Изолированный режим: см. [`PyConfig.isolated`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.isolated).

По умолчанию: `0` в режиме Python, `1` в изолированном режиме.

#### `int legacy_windows_fs_encoding`

Если не равно нулю:

- Устанавливает [`PyPreConfig.utf8_mode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.utf8_mode) в `0`,
- Устанавливает [`PyConfig.filesystem_encoding`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.filesystem_encoding) в `"mbcs"`,
- Устанавливает [`PyConfig.filesystem_errors`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.filesystem_errors) в `"replace"`.

Инициализировано из значения переменной окружения [`PYTHONLEGACYWINDOWSFSENCODING`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONLEGACYWINDOWSFSENCODING).

Доступно только в Windows. Макрос `#ifdef MS_WINDOWS` можно использовать для кода, зависящего от Windows.

По умолчанию: `0`.

#### `int parse_argv`

Если не равно нулю, [`Py_PreInitializeFromArgs()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_PreInitializeFromArgs) и [`Py_PreInitializeFromBytesArgs()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_PreInitializeFromBytesArgs) обрабатывают свой аргумент `argv` так же, как обычный Python обрабатывает аргументы командной строки: см. [Аргументы командной строки](https://python-all.ru/3.10/using/cmdline.html#using-on-cmdline).

По умолчанию: `1` в конфигурации Python, `0` в изолированной конфигурации.

#### `int use_environment`

Использовать [переменные окружения](https://python-all.ru/3.10/using/cmdline.html#using-on-envvars)? См. [`PyConfig.use_environment`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.use_environment).

По умолчанию: `1` в конфигурации Python и `0` в изолированной конфигурации.

#### `int utf8_mode`

Если не равно нулю, включает [Режим UTF-8 Python](https://python-all.ru/3.10/library/os.html#utf8-mode).

Устанавливается параметром командной строки [`-X utf8`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X) и переменной окружения [`PYTHONUTF8`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONUTF8).

По умолчанию: `-1` в конфигурации Python и `0` в изолированной конфигурации.

## Предварительная инициализация Python с PyPreConfig

Предварительная инициализация Python:

- Устанавливает распределители памяти Python ([`PyPreConfig.allocator`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.allocator))
- Настраивает локаль LC\_CTYPE ([кодировка локали](https://python-all.ru/3.10/glossary.html#term-locale-encoding))
- Устанавливает [Режим UTF-8 Python](https://python-all.ru/3.10/library/os.html#utf8-mode) ([`PyPreConfig.utf8_mode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.utf8_mode))

Текущая предварительная конфигурация (тип `PyPreConfig`) хранится в `_PyRuntime.preconfig`.

Функции для предварительной инициализации Python:

#### `PyStatus Py_PreInitialize(const PyPreConfig *preconfig)`

Преинициализировать Python из предварительной конфигурации *preconfig*.

*preconfig* не должен быть `NULL`.

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

Преинициализировать Python из предварительной конфигурации *preconfig*.

Обрабатывает аргументы командной строки *argv* (байтовые строки), если [`parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.parse_argv) в *preconfig* не равно нулю.

*preconfig* не должен быть `NULL`.

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

Преинициализировать Python из предварительной конфигурации *preconfig*.

Разобрать аргументы командной строки *argv* (широкие строки), если [`parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.parse_argv) структуры *preconfig* не равен нулю.

*preconfig* не должен быть `NULL`.

Вызывающий код отвечает за обработку исключений (ошибка или выход) с помощью `PyStatus_Exception()` и `Py_ExitStatusException()`.

Для [конфигурации Python](https://python-all.ru/3.10/c-api/init_config.html#init-python-config) (`PyPreConfig_InitPythonConfig()`), если Python инициализируется с аргументами командной строки, эти аргументы также должны быть переданы в преинициализацию Python, поскольку они влияют на предварительную конфигурацию, например, на кодировки. Например, параметр командной строки [`-X utf8`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X) включает [режим UTF-8 Python](https://python-all.ru/3.10/library/os.html#utf8-mode).

`PyMem_SetAllocator()` можно вызывать после [`Py_PreInitialize()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_PreInitialize) и до [`Py_InitializeFromConfig()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_InitializeFromConfig), чтобы установить собственный распределитель памяти. Его можно вызывать до [`Py_PreInitialize()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_PreInitialize), если [`PyPreConfig.allocator`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.allocator) установлен в `PYMEM_ALLOCATOR_NOT_SET`.

Функции выделения памяти Python, такие как [`PyMem_RawMalloc()`](https://python-all.ru/3.10/c-api/memory.html#c.PyMem_RawMalloc), не должны использоваться до преинициализации Python, тогда как прямой вызов `malloc()` и `free()` всегда безопасен. [`Py_DecodeLocale()`](https://python-all.ru/3.10/c-api/sys.html#c.Py_DecodeLocale) не должна вызываться до преинициализации Python.

Пример использования преинициализации для включения [режима UTF-8 Python](https://python-all.ru/3.10/library/os.html#utf8-mode):

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

preconfig.utf8_mode = 1;

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

/* на этом этапе Python использует кодировку UTF-8 */

Py_Initialize();
/* ... использовать Python API здесь ... */
Py_Finalize();
```

## PyConfig

#### `type PyConfig`

Структура, содержащая большинство параметров для настройки Python.

После завершения необходимо использовать функцию [`PyConfig_Clear()`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.PyConfig_Clear) для освобождения памяти конфигурации.

Методы структуры:

#### `void PyConfig_InitPythonConfig(PyConfig *config)`

Инициализировать конфигурацию с помощью [конфигурации Python](https://python-all.ru/3.10/c-api/init_config.html#init-python-config).

#### `void PyConfig_InitIsolatedConfig(PyConfig *config)`

Инициализировать конфигурацию с помощью [изолированной конфигурации](https://python-all.ru/3.10/c-api/init_config.html#init-isolated-conf).

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

Копировать широкую строку *str* в `*config_str`.

[Предварительно инициализировать Python](https://python-all.ru/3.10/c-api/init_config.html#c-preinit) при необходимости.

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

Декодировать *str* с помощью [`Py_DecodeLocale()`](https://python-all.ru/3.10/c-api/sys.html#c.Py_DecodeLocale) и записать результат в `*config_str`.

[Предварительно инициализировать Python](https://python-all.ru/3.10/c-api/init_config.html#c-preinit) при необходимости.

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

Установить аргументы командной строки (поле [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) структуры *config*) из списка широких строк *argv*.

[Предварительно инициализировать Python](https://python-all.ru/3.10/c-api/init_config.html#c-preinit) при необходимости.

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

Установить аргументы командной строки (поле [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) структуры *config*) из списка байтовых строк *argv*. Декодировать байты с помощью [`Py_DecodeLocale()`](https://python-all.ru/3.10/c-api/sys.html#c.Py_DecodeLocale).

[Предварительно инициализировать Python](https://python-all.ru/3.10/c-api/init_config.html#c-preinit) при необходимости.

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

Задать список широких строк *list* с длиной *length* и элементами *items*.

[Предварительно инициализировать Python](https://python-all.ru/3.10/c-api/init_config.html#c-preinit) при необходимости.

#### `PyStatus PyConfig_Read(PyConfig *config)`

Считывает всю конфигурацию Python.

Поля, которые уже инициализированы, остаются без изменений.

Функция [`PyConfig_Read()`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.PyConfig_Read) разбирает аргументы [`PyConfig.argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) только один раз: [`PyConfig.parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) устанавливается в `2` после разбора аргументов. Поскольку аргументы Python удаляются из [`PyConfig.argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv), повторный разбор привёл бы к интерпретации опций приложения как опций Python.

[Предварительно инициализировать Python](https://python-all.ru/3.10/c-api/init_config.html#c-preinit) при необходимости.

Изменено в версии 3.10: Аргументы [`PyConfig.argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) теперь анализируются только один раз, [`PyConfig.parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) устанавливается в `2` после анализа аргументов, и аргументы анализируются только если [`PyConfig.parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) равно `1`.

#### `void PyConfig_Clear(PyConfig *config)`

Освобождает память конфигурации.

Большинство методов `PyConfig` при необходимости [преинициализируют Python](https://python-all.ru/3.10/c-api/init_config.html#c-preinit). В этом случае конфигурация преинициализации Python ([`PyPreConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig)) основана на [`PyConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig). Если настраиваются поля конфигурации, общие с [`PyPreConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig), они должны быть заданы перед вызовом метода [`PyConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig):

- [`PyConfig.dev_mode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.dev_mode)
- [`PyConfig.isolated`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.isolated)
- [`PyConfig.parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv)
- [`PyConfig.use_environment`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.use_environment)

Более того, если используется [`PyConfig_SetArgv()`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.PyConfig_SetArgv) или [`PyConfig_SetBytesArgv()`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.PyConfig_SetBytesArgv), этот метод должен вызываться перед другими методами, так как конфигурация предварительной инициализации зависит от аргументов командной строки (если [`parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) не равно нулю).

Вызывающий эти методы отвечает за обработку исключений (ошибка или выход) с помощью `PyStatus_Exception()` и `Py_ExitStatusException()`.

Поля структуры:

#### `PyWideStringList argv`

Аргументы командной строки: [`sys.argv`](https://python-all.ru/3.10/library/sys.html#sys.argv).

Устанавливает [`parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) в `1` для анализа [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) таким же образом, как обычный Python анализирует аргументы командной строки Python, а затем для удаления аргументов Python из [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv).

Если [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) пуст, добавляется пустая строка, чтобы гарантировать, что [`sys.argv`](https://python-all.ru/3.10/library/sys.html#sys.argv) всегда существует и никогда не пуст.

По умолчанию: `NULL`.

См. также член [`orig_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.orig_argv).

#### `wchar_t *base_exec_prefix`

[`sys.base_exec_prefix`](https://python-all.ru/3.10/library/sys.html#sys.base_exec_prefix).

По умолчанию: `NULL`.

Часть выходных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `wchar_t *base_executable`

Базовый исполняемый файл Python: `sys._base_executable`.

Устанавливается переменной окружения `__PYVENV_LAUNCHER__`.

Устанавливается из [`PyConfig.executable`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.executable), если `NULL`.

По умолчанию: `NULL`.

Часть выходных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `wchar_t *base_prefix`

[`sys.base_prefix`](https://python-all.ru/3.10/library/sys.html#sys.base_prefix).

По умолчанию: `NULL`.

Часть выходных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `int buffered_stdio`

Если равно 0 и [`configure_c_stdio`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.configure_c_stdio) не равно нулю, отключить буферизацию на потоках C stdout и stderr.

Устанавливается в 0 параметром командной строки [`-u`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-u) и переменной окружения [`PYTHONUNBUFFERED`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONUNBUFFERED).

stdin всегда открывается в буферизированном режиме.

По умолчанию: `1`.

#### `int bytes_warning`

Если значение равно 1, выдавать предупреждение при сравнении [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes) или [`bytearray`](https://python-all.ru/3.10/library/stdtypes.html#bytearray) с [`str`](https://python-all.ru/3.10/library/stdtypes.html#str), или при сравнении [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes) с [`int`](https://python-all.ru/3.10/library/functions.html#int).

Если значение больше или равно 2, в этих случаях возбуждать исключение [`BytesWarning`](https://python-all.ru/3.10/library/exceptions.html#BytesWarning).

Увеличивается опцией командной строки [`-b`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-b).

По умолчанию: `0`.

#### `int warn_default_encoding`

Если не равно нулю, выдаётся предупреждение [`EncodingWarning`](https://python-all.ru/3.10/library/exceptions.html#EncodingWarning), когда [`io.TextIOWrapper`](https://python-all.ru/3.10/library/io.html#io.TextIOWrapper) использует свою кодировку по умолчанию. Подробнее см. [Opt-in EncodingWarning](https://python-all.ru/3.10/library/io.html#io-encoding-warning).

По умолчанию: `0`.

Новое в версии 3.10.

#### `wchar_t *check_hash_pycs_mode`

Управляет поведением проверки hash-based `.pyc` файлов: значение параметра командной строки [`--check-hash-based-pycs`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-check-hash-based-pycs).

Допустимые значения:

- `L"always"`: Хешировать исходный файл для инвалидации независимо от значения флага ‘check\_source’.
- `L"never"`: Считать, что хеш-основанные pyc всегда корректны.
- `L"default"`: Флаг ‘check\_source’ в хеш-основанных pyc определяет недействительность.

По умолчанию: `L"default"`.

См. также [**PEP 552**](https://python-all.ru/3.10/c-api/init_config.html) «Детерминированные pyc».

#### `int configure_c_stdio`

Если не равно нулю, настраиваются стандартные потоки C:

- В Windows устанавливается двоичный режим (`O_BINARY`) для stdin, stdout и stderr.
- Если [`buffered_stdio`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.buffered_stdio) равно нулю, буферизация потоков stdin, stdout и stderr отключается.
- Если [`interactive`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.interactive) не равно нулю, буферизация потоков stdin и stdout включается (только stdout в Windows).

По умолчанию: `1` в конфигурации Python, `0` в изолированной конфигурации.

#### `int dev_mode`

Если не равно нулю, включается [режим разработки Python](https://python-all.ru/3.10/library/devmode.html#devmode).

По умолчанию: `-1` в режиме Python, `0` в изолированном режиме.

#### `int dump_refs`

Сбрасывать ссылки Python?

Если не равно нулю, сбрасывать все объекты, которые все еще существуют при завершении.

Устанавливается в `1` переменной окружения [`PYTHONDUMPREFS`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONDUMPREFS).

Требуется специальная сборка Python с определённым макросом `Py_TRACE_REFS`: см. [`configure --with-trace-refs option`](https://python-all.ru/3.10/using/configure.html#cmdoption-with-trace-refs).

По умолчанию: `0`.

#### `wchar_t *exec_prefix`

Префикс каталога, специфичного для сайта, где устанавливаются платформозависимые файлы Python: [`sys.exec_prefix`](https://python-all.ru/3.10/library/sys.html#sys.exec_prefix).

По умолчанию: `NULL`.

Часть выходных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `wchar_t *executable`

Абсолютный путь к исполняемому двоичному файлу интерпретатора Python: [`sys.executable`](https://python-all.ru/3.10/library/sys.html#sys.executable).

По умолчанию: `NULL`.

Часть выходных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `int faulthandler`

Включить faulthandler?

Если не равно нулю, вызывается [`faulthandler.enable()`](https://python-all.ru/3.10/library/faulthandler.html#faulthandler.enable) при запуске.

Устанавливается в `1` с помощью [`-X faulthandler`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X) и переменной окружения [`PYTHONFAULTHANDLER`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONFAULTHANDLER).

По умолчанию: `-1` в режиме Python, `0` в изолированном режиме.

#### `wchar_t *filesystem_encoding`

[Кодировка файловой системы](https://python-all.ru/3.10/glossary.html#term-filesystem-encoding-and-error-handler): [`sys.getfilesystemencoding()`](https://python-all.ru/3.10/library/sys.html#sys.getfilesystemencoding).

На macOS, Android и VxWorks: по умолчанию используется `"utf-8"`.

На Windows: по умолчанию используется `"utf-8"` или `"mbcs"`, если [`legacy_windows_fs_encoding`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.legacy_windows_fs_encoding) параметра [`PyPreConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig) не равно нулю.

Кодировка по умолчанию на других платформах:

- `"utf-8"`, если [`PyPreConfig.utf8_mode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.utf8_mode) не равно нулю.
- `"ascii"`, если Python определяет, что `nl_langinfo(CODESET)` объявляет кодировку ASCII, в то время как функция `mbstowcs()` декодирует из другой кодировки (обычно Latin1).
- `"utf-8"`, если `nl_langinfo(CODESET)` возвращает пустую строку.
- В противном случае используется [кодировка локали](https://python-all.ru/3.10/glossary.html#term-locale-encoding): результат `nl_langinfo(CODESET)`.

При запуске Python имя кодировки нормализуется до имени кодека Python. Например, `"ANSI_X3.4-1968"` заменяется на `"ascii"`.

См. также член [`filesystem_errors`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.filesystem_errors).

#### `wchar_t *filesystem_errors`

[Обработчик ошибок файловой системы](https://python-all.ru/3.10/glossary.html#term-filesystem-encoding-and-error-handler): [`sys.getfilesystemencodeerrors()`](https://python-all.ru/3.10/library/sys.html#sys.getfilesystemencodeerrors).

На Windows: по умолчанию используется `"surrogatepass"` или `"replace"`, если [`legacy_windows_fs_encoding`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.legacy_windows_fs_encoding) параметра [`PyPreConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig) не равно нулю.

На других платформах: по умолчанию используется `"surrogateescape"`.

Поддерживаемые обработчики ошибок:

- `"strict"`
- `"surrogateescape"`
- `"surrogatepass"` (поддерживается только с кодировкой UTF-8)

См. также член [`filesystem_encoding`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.filesystem_encoding).

#### `unsigned long hash_seed`

#### `int use_hash_seed`

Случайное зерно хеш-функции.

Если [`use_hash_seed`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.use_hash_seed) равен нулю, начальное значение (seed) выбирается случайным образом при запуске Python, а [`hash_seed`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.hash_seed) игнорируется.

Устанавливается переменной окружения [`PYTHONHASHSEED`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONHASHSEED).

Значение *use\_hash\_seed* по умолчанию: `-1` в режиме Python, `0` в изолированном режиме.

#### `wchar_t *home`

Домашний каталог Python.

Если [`Py_SetPythonHome()`](https://python-all.ru/3.10/c-api/init.html#c.Py_SetPythonHome) была вызвана, используйте её аргумент, если он не равен `NULL`.

Устанавливается переменной окружения [`PYTHONHOME`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONHOME).

По умолчанию: `NULL`.

Часть входных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `int import_time`

Если не ноль, профилировать время импорта.

Значение `1` задаётся опцией [`-X importtime`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X) и переменной окружения [`PYTHONPROFILEIMPORTTIME`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONPROFILEIMPORTTIME).

По умолчанию: `0`.

#### `int inspect`

Войти в интерактивный режим после выполнения скрипта или команды.

Если значение больше 0, включить инспекцию: если скрипт передан в качестве первого аргумента или используется опция -c, после выполнения скрипта или команды перейти в интерактивный режим, даже если [`sys.stdin`](https://python-all.ru/3.10/library/sys.html#sys.stdin) не выглядит как терминал.

Увеличивается опцией командной строки [`-i`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-i). Устанавливается в `1`, если переменная окружения [`PYTHONINSPECT`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONINSPECT) не пуста.

По умолчанию: `0`.

#### `int install_signal_handlers`

Устанавливать обработчики сигналов Python?

По умолчанию: `1` в режиме Python, `0` в изолированном режиме.

#### `int interactive`

Если значение больше 0, включить интерактивный режим (REPL).

Увеличивается опцией командной строки [`-i`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-i).

По умолчанию: `0`.

#### `int isolated`

Если значение больше 0, включить изолированный режим:

- [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) не содержит ни каталог скрипта (вычисленный из `argv[0]` или текущего каталога), ни каталог site-packages пользователя.
- REPL Python не импортирует [`readline`](https://python-all.ru/3.10/library/readline.html#module-readline) и не включает стандартную конфигурацию readline в интерактивных приглашениях.
- Установить [`use_environment`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.use_environment) и [`user_site_directory`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.user_site_directory) в 0.

По умолчанию: `0` в режиме Python, `1` в изолированном режиме.

См. также [`PyPreConfig.isolated`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.isolated).

#### `int legacy_windows_stdio`

Если не ноль, использовать [`io.FileIO`](https://python-all.ru/3.10/library/io.html#io.FileIO) вместо `io.WindowsConsoleIO` для [`sys.stdin`](https://python-all.ru/3.10/library/sys.html#sys.stdin), [`sys.stdout`](https://python-all.ru/3.10/library/sys.html#sys.stdout) и [`sys.stderr`](https://python-all.ru/3.10/library/sys.html#sys.stderr).

Устанавливается в `1`, если переменная окружения [`PYTHONLEGACYWINDOWSSTDIO`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONLEGACYWINDOWSSTDIO) установлена в непустую строку.

Доступно только в Windows. Макрос `#ifdef MS_WINDOWS` можно использовать для кода, зависящего от Windows.

По умолчанию: `0`.

См. также [**PEP 528**](https://python-all.ru/3.10/c-api/init_config.html) (Изменение кодировки консоли Windows на UTF-8).

#### `int malloc_stats`

Если не ноль, вывести статистику по [аллокатору памяти Python pymalloc](https://python-all.ru/3.10/c-api/memory.html#pymalloc) при завершении.

Устанавливается в `1` переменной окружения [`PYTHONMALLOCSTATS`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONMALLOCSTATS).

Параметр игнорируется, если Python [`configured using the --without-pymalloc option`](https://python-all.ru/3.10/using/configure.html#cmdoption-without-pymalloc).

По умолчанию: `0`.

#### `wchar_t *platlibdir`

Имя каталога библиотек платформы: [`sys.platlibdir`](https://python-all.ru/3.10/library/sys.html#sys.platlibdir).

Устанавливается переменной окружения [`PYTHONPLATLIBDIR`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONPLATLIBDIR).

По умолчанию: значение макроса `PLATLIBDIR`, который задаётся [`configure --with-platlibdir option`](https://python-all.ru/3.10/using/configure.html#cmdoption-with-platlibdir) (по умолчанию: `"lib"`).

Часть входных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

Новое в версии 3.9.

#### `wchar_t *pythonpath_env`

Пути поиска модулей ([`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path)) в виде строки, разделённой `DELIM` (`os.path.pathsep`).

Устанавливается переменной окружения [`PYTHONPATH`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONPATH).

По умолчанию: `NULL`.

Часть входных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `PyWideStringList module_search_paths`

#### `int module_search_paths_set`

Пути поиска модулей: [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path).

Если [`module_search_paths_set`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths_set) равно 0, функция, вычисляющая [конфигурацию путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config), переопределяет [`module_search_paths`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths) и устанавливает [`module_search_paths_set`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths_set) в `1`.

По умолчанию: пустой список (`module_search_paths`) и `0` (`module_search_paths_set`).

Часть выходных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `int optimization_level`

Уровень оптимизации компиляции:

- `0`: Оптимизатор Peephole, устанавливает `__debug__` в `True`.
- `1`: Уровень 0, удаляет утверждения, устанавливает `__debug__` в `False`.
- `2`: Уровень 1, удаляет строки документации.

Увеличивается опцией командной строки [`-O`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-O). Устанавливается в значение переменной окружения [`PYTHONOPTIMIZE`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONOPTIMIZE).

По умолчанию: `0`.

#### `PyWideStringList orig_argv`

Список исходных аргументов командной строки, переданных исполняемому файлу Python: [`sys.orig_argv`](https://python-all.ru/3.10/library/sys.html#sys.orig_argv).

Если список [`orig_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.orig_argv) пуст, а [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) не является списком, содержащим только пустую строку, то [`PyConfig_Read()`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.PyConfig_Read) копирует [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) в [`orig_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.orig_argv) перед изменением [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) (если [`parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) не равно нулю).

См. также элемент [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) и функцию [`Py_GetArgcArgv()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_GetArgcArgv).

По умолчанию: пустой список.

Новое в версии 3.10.

#### `int parse_argv`

Разбирать аргументы командной строки?

Если равно `1`, разбирать [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) так же, как обычный Python разбирает [аргументы командной строки](https://python-all.ru/3.10/using/cmdline.html#using-on-cmdline), и удалять аргументы Python из [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv).

Функция [`PyConfig_Read()`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.PyConfig_Read) разбирает аргументы [`PyConfig.argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) только один раз: [`PyConfig.parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) устанавливается в `2` после разбора аргументов. Поскольку аргументы Python удаляются из [`PyConfig.argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv), повторный разбор привёл бы к интерпретации опций приложения как опций Python.

По умолчанию: `1` в режиме Python, `0` в изолированном режиме.

Изменено в версии 3.10: Аргументы [`PyConfig.argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) теперь разбираются только если [`PyConfig.parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) равно `1`.

#### `int parser_debug`

Режим отладки парсера. Если больше 0, включает вывод отладочной информации парсера (только для экспертов, зависит от опций компиляции).

Увеличивается опцией командной строки [`-d`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-d). Устанавливается в значение переменной окружения [`PYTHONDEBUG`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONDEBUG).

По умолчанию: `0`.

#### `int pathconfig_warnings`

В Unix, если не равно нулю, вычисление [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config) может записывать предупреждения в `stderr`. Если равно 0, подавлять эти предупреждения.

Не оказывает эффекта на Windows.

По умолчанию: `1` в режиме Python, `0` в изолированном режиме.

Часть входных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `wchar_t *prefix`

Префикс каталога, специфичный для сайта, в который устанавливаются платформонезависимые файлы Python: [`sys.prefix`](https://python-all.ru/3.10/library/sys.html#sys.prefix).

По умолчанию: `NULL`.

Часть выходных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `wchar_t *program_name`

Имя программы, используемое для инициализации [`executable`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.executable) и в ранних сообщениях об ошибках во время инициализации Python.

- Если `Py_SetProgramName()` был вызван, используется его аргумент.
- На macOS используется переменная окружения [`PYTHONEXECUTABLE`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONEXECUTABLE), если она установлена.
- Если определён макрос `WITH_NEXT_FRAMEWORK`, используется переменная окружения `__PYVENV_LAUNCHER__`, если она установлена.
- Используется `argv[0]` из [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv), если она доступна и непустая.
- В противном случае используется `L"python"` на Windows или `L"python3"` на других платформах.

По умолчанию: `NULL`.

Часть входных данных [конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config).

#### `wchar_t *pycache_prefix`

Каталог, в который записываются кэшированные файлы `.pyc`: [`sys.pycache_prefix`](https://python-all.ru/3.10/library/sys.html#sys.pycache_prefix).

Устанавливается [`-X pycache_prefix=PATH`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X) опцией командной строки и переменной окружения [`PYTHONPYCACHEPREFIX`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONPYCACHEPREFIX).

Если `NULL`, [`sys.pycache_prefix`](https://python-all.ru/3.10/library/sys.html#sys.pycache_prefix) устанавливается в `None`.

По умолчанию: `NULL`.

#### `int quiet`

Тихий режим. Если больше 0, не отображать информацию об авторских правах и версии при запуске Python в интерактивном режиме.

Увеличивается опцией командной строки [`-q`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-q).

По умолчанию: `0`.

#### `wchar_t *run_command`

Значение параметра командной строки [`-c`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-c).

Используется [`Py_RunMain()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_RunMain).

По умолчанию: `NULL`.

#### `wchar_t *run_filename`

Имя файла, переданное в командной строке: последний аргумент командной строки без [`-c`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-c) или [`-m`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-m).

Например, устанавливается в `script.py` командой `python3 script.py arg`.

Используется [`Py_RunMain()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_RunMain).

По умолчанию: `NULL`.

#### `wchar_t *run_module`

Значение параметра командной строки [`-m`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-m).

Используется [`Py_RunMain()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_RunMain).

По умолчанию: `NULL`.

#### `int show_ref_count`

Показывать общее количество ссылок при завершении?

Устанавливается в 1 опцией командной строки [`-X showrefcount`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X).

Требуется [отладочная сборка Python](https://python-all.ru/3.10/using/configure.html#debug-build) (макрос `Py_REF_DEBUG` должен быть определён).

По умолчанию: `0`.

#### `int site_import`

Импортировать модуль [`site`](https://python-all.ru/3.10/library/site.html#module-site) при запуске?

Если равно нулю, импорт модуля site и зависящие от site манипуляции с [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) отключаются.

Также отключает эти манипуляции, если модуль [`site`](https://python-all.ru/3.10/library/site.html#module-site) импортирован явно (вызовите [`site.main()`](https://python-all.ru/3.10/library/site.html#site.main), чтобы включить их).

Устанавливается в `0` параметром командной строки [`-S`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-S).

`sys.flags.no_site` устанавливается в инвертированное значение [`site_import`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.site_import).

По умолчанию: `1`.

#### `int skip_source_first_line`

Если не ноль, пропустить первую строку исходного кода [`PyConfig.run_filename`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_filename).

Это позволяет использовать не-Unix формы `#!cmd`. Предназначено только для DOS-специфичного хака.

Устанавливается в `1` параметром командной строки [`-x`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-x).

По умолчанию: `0`.

#### `wchar_t *stdio_encoding`

#### `wchar_t *stdio_errors`

Кодировка и ошибки кодирования для [`sys.stdin`](https://python-all.ru/3.10/library/sys.html#sys.stdin), [`sys.stdout`](https://python-all.ru/3.10/library/sys.html#sys.stdout) и [`sys.stderr`](https://python-all.ru/3.10/library/sys.html#sys.stderr) (но [`sys.stderr`](https://python-all.ru/3.10/library/sys.html#sys.stderr) всегда использует обработчик ошибок `"backslashreplace"`).

Если [`Py_SetStandardStreamEncoding()`](https://python-all.ru/3.10/c-api/init.html#c.Py_SetStandardStreamEncoding) была вызвана, используются её аргументы *error* и *errors*, если они не `NULL`.

Использовать переменную окружения [`PYTHONIOENCODING`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONIOENCODING), если она не пуста.

Кодировка по умолчанию:

- `"UTF-8"`, если [`PyPreConfig.utf8_mode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.utf8_mode) не равно нулю.
- В противном случае используется [кодировка локали](https://python-all.ru/3.10/glossary.html#term-locale-encoding).

Обработчик ошибок по умолчанию:

- В Windows: используется `"surrogateescape"`.
- `"surrogateescape"`, если [`PyPreConfig.utf8_mode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyPreConfig.utf8_mode) не равно нулю, или если локаль LC\_CTYPE имеет значение «C» или «POSIX».
- `"strict"` в противном случае.

#### `int tracemalloc`

Включить tracemalloc?

Если не равно нулю, вызывается [`tracemalloc.start()`](https://python-all.ru/3.10/library/tracemalloc.html#tracemalloc.start) при запуске.

Устанавливается параметром командной строки [`-X tracemalloc=N`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X) и переменной окружения [`PYTHONTRACEMALLOC`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONTRACEMALLOC).

По умолчанию: `-1` в режиме Python, `0` в изолированном режиме.

#### `int use_environment`

Использовать [переменные окружения](https://python-all.ru/3.10/using/cmdline.html#using-on-envvars)?

Если равно нулю, игнорируются [переменные окружения](https://python-all.ru/3.10/using/cmdline.html#using-on-envvars).

По умолчанию: `1` в конфигурации Python и `0` в изолированной конфигурации.

#### `int user_site_directory`

Если не равно нулю, в [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) добавляется каталог пользовательского site.

Устанавливается в `0` с помощью опций командной строки [`-s`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-s) и [`-I`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-I).

Устанавливается в `0` переменной окружения [`PYTHONNOUSERSITE`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONNOUSERSITE).

По умолчанию: `1` в режиме Python, `0` в изолированном режиме.

#### `int verbose`

Подробный режим. Если больше 0, выводить сообщение каждый раз при импорте модуля, показывая источник (имя файла или встроенный модуль), из которого он загружается.

Если больше или равно 2, выводить сообщение для каждого проверяемого файла при поиске модуля. Также предоставляет информацию об очистке модулей при завершении.

Увеличивается опцией командной строки [`-v`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-1).

Устанавливается в значение переменной окружения [`PYTHONVERBOSE`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONVERBOSE).

По умолчанию: `0`.

#### `PyWideStringList warnoptions`

Опции модуля [`warnings`](https://python-all.ru/3.10/library/warnings.html#module-warnings) для построения фильтров предупреждений, от низшего к высшему приоритету: [`sys.warnoptions`](https://python-all.ru/3.10/library/sys.html#sys.warnoptions).

Модуль [`warnings`](https://python-all.ru/3.10/library/warnings.html#module-warnings) добавляет [`sys.warnoptions`](https://python-all.ru/3.10/library/sys.html#sys.warnoptions) в обратном порядке: последний элемент [`PyConfig.warnoptions`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.warnoptions) становится первым элементом `warnings.filters`, который проверяется первым (наивысший приоритет).

Опция командной строки [`-W`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-W) добавляет своё значение в [`warnoptions`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.warnoptions); её можно использовать несколько раз.

Переменная окружения [`PYTHONWARNINGS`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONWARNINGS) также может использоваться для добавления опций предупреждений. Можно указать несколько опций, разделённых запятыми (`,`).

По умолчанию: пустой список.

#### `int write_bytecode`

Если равно 0, Python не будет пытаться записывать файлы `.pyc` при импорте исходных модулей.

Устанавливается в `0` опцией командной строки [`-B`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-B) и переменной окружения [`PYTHONDONTWRITEBYTECODE`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE).

[`sys.dont_write_bytecode`](https://python-all.ru/3.10/library/sys.html#sys.dont_write_bytecode) инициализируется инвертированным значением [`write_bytecode`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.write_bytecode).

По умолчанию: `1`.

#### `PyWideStringList xoptions`

Значения опций командной строки [`-X`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X): [`sys._xoptions`](https://python-all.ru/3.10/library/sys.html#sys._xoptions).

По умолчанию: пустой список.

Если [`parse_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.parse_argv) не равно нулю, аргументы [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) разбираются так же, как обычный Python разбирает [аргументы командной строки](https://python-all.ru/3.10/using/cmdline.html#using-on-cmdline), а аргументы Python удаляются из [`argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv).

Параметры [`xoptions`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.xoptions) разбираются для установки других опций: см. опцию командной строки [`-X`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-X).

Изменено в версии 3.9: Поле `show_alloc_count` было удалено.

## Инициализация с PyConfig

Функция для инициализации Python:

#### `PyStatus Py_InitializeFromConfig(const PyConfig *config)`

Инициализирует Python из конфигурации *config*.

Вызывающий код отвечает за обработку исключений (ошибка или выход) с помощью `PyStatus_Exception()` и `Py_ExitStatusException()`.

Если используются [`PyImport_FrozenModules()`](https://python-all.ru/3.10/c-api/import.html#c.PyImport_FrozenModules), [`PyImport_AppendInittab()`](https://python-all.ru/3.10/c-api/import.html#c.PyImport_AppendInittab) или [`PyImport_ExtendInittab()`](https://python-all.ru/3.10/c-api/import.html#c.PyImport_ExtendInittab), они должны быть установлены или вызваны после предварительной инициализации Python и до инициализации Python. Если Python инициализируется несколько раз, [`PyImport_AppendInittab()`](https://python-all.ru/3.10/c-api/import.html#c.PyImport_AppendInittab) или [`PyImport_ExtendInittab()`](https://python-all.ru/3.10/c-api/import.html#c.PyImport_ExtendInittab) должны вызываться перед каждой инициализацией Python.

Текущая конфигурация (тип `PyConfig`) хранится в `PyInterpreterState.config`.

Пример установки имени программы:

```c
void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Установить имя программы. Неявно предварительно инициализировать 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);
}
```

Более полный пример изменения конфигурации по умолчанию: чтение конфигурации и последующее переопределение некоторых параметров:

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

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Установить имя программы перед чтением конфигурации
       (декодировать байтовую строку из кодировки локали).

       Неявно предварительно инициализировать Python. */
    status = PyConfig_SetBytesString(&config, &config.program_name,
                                     program_name);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Прочитать всю конфигурацию сразу */
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Добавляет пользовательский путь поиска в sys.path */
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/more/modules");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Переопределить исполняемый файл, вычисленный 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;
}
```

## Изолированная конфигурация

Функции `PyPreConfig_InitIsolatedConfig()` и `PyConfig_InitIsolatedConfig()` создают конфигурацию для изоляции Python от системы. Например, для встраивания Python в приложение.

Эта конфигурация игнорирует глобальные переменные конфигурации, переменные окружения, аргументы командной строки ([`PyConfig.argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.argv) не разбирается) и каталог пользовательских сайтов. Стандартные потоки C (например: `stdout`) и локаль LC\_CTYPE остаются без изменений. Обработчики сигналов не устанавливаются.

Файлы конфигурации по-прежнему используются с этой конфигурацией. Установите [Python Path Configuration](https://python-all.ru/3.10/c-api/init_config.html#init-path-config) («выходные поля»), чтобы игнорировать эти файлы конфигурации и избежать вычисления функцией пути конфигурации по умолчанию.

## Конфигурация Python

Функции `PyPreConfig_InitPythonConfig()` и `PyConfig_InitPythonConfig()` создают конфигурацию для сборки настраиваемого Python, который ведёт себя как обычный Python.

Переменные окружения и аргументы командной строки используются для настройки Python, тогда как глобальные переменные конфигурации игнорируются.

Эта функция включает принудительное использование локали C ([**PEP 538**](https://python-all.ru/3.10/c-api/init_config.html)) и [Режим Python UTF-8](https://python-all.ru/3.10/library/os.html#utf8-mode) ([**PEP 540**](https://python-all.ru/3.10/c-api/init_config.html)) в зависимости от локали LC\_CTYPE, переменных окружения [`PYTHONUTF8`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONUTF8) и [`PYTHONCOERCECLOCALE`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONCOERCECLOCALE).

## Конфигурация путей Python

[`PyConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig) содержит несколько полей для конфигурации путей:

- Входные данные конфигурации путей:

  - [`PyConfig.home`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.home)
  - [`PyConfig.platlibdir`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.platlibdir)
  - [`PyConfig.pathconfig_warnings`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.pathconfig_warnings)
  - [`PyConfig.program_name`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.program_name)
  - [`PyConfig.pythonpath_env`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.pythonpath_env)
  - текущий рабочий каталог: для получения абсолютных путей
  - переменная окружения `PATH` для получения полного пути программы (из [`PyConfig.program_name`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.program_name))
  - переменная окружения `__PYVENV_LAUNCHER__`
  - (только Windows) Пути приложений в реестре в разделе “SoftwarePythonPythonCoreX.YPythonPath” для HKEY\_CURRENT\_USER и HKEY\_LOCAL\_MACHINE (где X.Y – версия Python).
- Выходные поля конфигурации путей:

  - [`PyConfig.base_exec_prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.base_exec_prefix)
  - [`PyConfig.base_executable`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.base_executable)
  - [`PyConfig.base_prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.base_prefix)
  - [`PyConfig.exec_prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.exec_prefix)
  - [`PyConfig.executable`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.executable)
  - [`PyConfig.module_search_paths_set`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths_set), [`PyConfig.module_search_paths`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths)
  - [`PyConfig.prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.prefix)

Если хотя бы одно «выходное поле» не установлено, Python вычисляет конфигурацию пути, чтобы заполнить неустановленные поля. Если [`module_search_paths_set`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths_set) равно 0, [`module_search_paths`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths) переопределяется и [`module_search_paths_set`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.module_search_paths_set) устанавливается в 1.

Можно полностью игнорировать функцию вычисления конфигурации пути по умолчанию, явно задав все перечисленные выше выходные поля конфигурации пути. Строка считается установленной, даже если она непуста. `module_search_paths` считается установленным, если `module_search_paths_set` установлено в 1. В этом случае входные поля конфигурации пути также игнорируются.

Установите [`pathconfig_warnings`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.pathconfig_warnings) в 0, чтобы подавить предупреждения при вычислении конфигурации пути (только Unix; Windows не выводит предупреждения).

Если поля [`base_prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.base_prefix) или [`base_exec_prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.base_exec_prefix) не заданы, они наследуют свои значения от [`prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.prefix) и [`exec_prefix`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.exec_prefix) соответственно.

[`Py_RunMain()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_RunMain) и [`Py_Main()`](https://python-all.ru/3.10/c-api/veryhigh.html#c.Py_Main) изменяют [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path):

- Если [`run_filename`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_filename) задано и является каталогом, содержащим скрипт `__main__.py`, добавьте [`run_filename`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_filename) в начало [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path).
- Если [`isolated`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.isolated) равно нулю:

  - Если [`run_module`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_module) задан, добавьте текущий каталог в начало [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path). Ничего не делайте, если текущий каталог не может быть прочитан.
  - Если [`run_filename`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_filename) задан, добавьте каталог файла в начало [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path).
  - В противном случае пустая строка добавляется в начало [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path).

Если [`site_import`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.site_import) не равно нулю, то [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) может быть изменён модулем [`site`](https://python-all.ru/3.10/library/site.html#module-site). Если [`user_site_directory`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.user_site_directory) не равно нулю и каталог пакетов сайта пользователя существует, модуль [`site`](https://python-all.ru/3.10/library/site.html#module-site) добавляет каталог пакетов сайта пользователя в [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path).

При конфигурации путей используются следующие файлы конфигурации:

- `pyvenv.cfg`
- `python._pth` (только Windows)
- `pybuilddir.txt` (только Unix)

Переменная окружения `__PYVENV_LAUNCHER__` используется для установки [`PyConfig.base_executable`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.base_executable).

## Py\_RunMain()

#### `int Py_RunMain(void)`

Выполняет команду ([`PyConfig.run_command`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_command)), скрипт ([`PyConfig.run_filename`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_filename)) или модуль ([`PyConfig.run_module`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.run_module)), указанные в командной строке или в конфигурации.

По умолчанию, а также при использовании опции [`-i`](https://python-all.ru/3.10/using/cmdline.html#cmdoption-i), запускается REPL.

Наконец, завершает работу Python и возвращает код завершения, который можно передать функции `exit()`.

См. [Python Configuration](https://python-all.ru/3.10/c-api/init_config.html#init-python-config) для примера настройки Python для постоянной работы в изолированном режиме с помощью [`Py_RunMain()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_RunMain).

## Py\_GetArgcArgv()

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

Возвращает исходные аргументы командной строки до того, как Python их изменил.

См. также элемент [`PyConfig.orig_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.orig_argv).

## Многофазная инициализация (частный временный API)

Данный раздел представляет собой частный временный API, вводящий многофазную инициализацию – ключевую возможность [**PEP 432**](https://python-all.ru/3.10/c-api/init_config.html):

- Фаза «базовой» инициализации, «минимальный Python»:

  - Встроенные типы;
  - Встроенные исключения;
  - Встроенные и замороженные модули;
  - Модуль [`sys`](https://python-all.ru/3.10/library/sys.html#module-sys) инициализирован лишь частично (например, [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) ещё не существует).
- Фаза «основной» инициализации, Python полностью инициализирован:

  - Устанавливает и настраивает [`importlib`](https://python-all.ru/3.10/library/importlib.html#module-importlib);
  - Применяет [конфигурацию путей](https://python-all.ru/3.10/c-api/init_config.html#init-path-config);
  - Устанавливает обработчики сигналов;
  - Завершает инициализацию модуля [`sys`](https://python-all.ru/3.10/library/sys.html#module-sys) (например, создаёт [`sys.stdout`](https://python-all.ru/3.10/library/sys.html#sys.stdout) и [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path));
  - Включает опциональные возможности, такие как [`faulthandler`](https://python-all.ru/3.10/library/faulthandler.html#module-faulthandler) и [`tracemalloc`](https://python-all.ru/3.10/library/tracemalloc.html#module-tracemalloc);
  - Импортировать модуль [`site`](https://python-all.ru/3.10/library/site.html#module-site);
  - и т. д.

Частный временный API:

- `PyConfig._init_main`: если установлено в 0, [`Py_InitializeFromConfig()`](https://python-all.ru/3.10/c-api/init_config.html#c.Py_InitializeFromConfig) останавливается на фазе инициализации «Core».
- `PyConfig._isolated_interpreter`: если не равно нулю, запретить потоки, подпроцессы и fork.

#### `PyStatus _Py_InitializeMain(void)`

Переход к фазе инициализации «Main», завершение инициализации Python.

Во время фазы «Core» не импортируется ни один модуль, а модуль `importlib` не настроен: [Path Configuration](https://python-all.ru/3.10/c-api/init_config.html#init-path-config) применяется только во время фазы «Main». Это может позволить настраивать Python из Python, чтобы переопределить или настроить [Path Configuration](https://python-all.ru/3.10/c-api/init_config.html#init-path-config), возможно, установить пользовательский импортёр [`sys.meta_path`](https://python-all.ru/3.10/library/sys.html#sys.meta_path) или хук импорта и т. д.

Возможно, станет возможным вычислять [конфигурацию путей](https://python-all.ru/3.10/c-api/init_config.html#init-path-config) в Python после этапа Core и до этапа Main, что является одной из мотиваций [**PEP 432**](https://python-all.ru/3.10/c-api/init_config.html).

Фаза «Core» не определена должным образом: что должно и что не должно быть доступно на этой фазе, пока не указано. API помечен как частный и временный: API может быть изменён или даже удалён в любое время, пока не будет спроектирован надлежащий публичный API.

Пример выполнения кода Python между фазами инициализации «Core» и «Main»:

```c
void init_python(void)
{
    PyStatus status;

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

    /* настроить конфигурацию 'config' */

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

    /* ... разместить здесь дополнительный код конфигурации ...
       вызывается _Py_InitializeMain() */
    int res = PyRun_SimpleString(
        "import sys; "
        "print('Run Python code before _Py_InitializeMain', "
               "file=sys.stderr)");
    if (res < 0) {
        exit(1);
    }

    /* ... добавьте сюда дополнительный код конфигурации ... */

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