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

---

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

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

Структуры:

- [`PyConfig`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig)
- [`PyPreConfig`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig)
- [`PyStatus`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus)
- [`PyWideStringList`](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList)

Функции:

- [`PyConfig_Clear()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_Clear)
- [`PyConfig_InitIsolatedConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_InitIsolatedConfig)
- [`PyConfig_InitPythonConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_InitPythonConfig)
- [`PyConfig_Read()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_Read)
- [`PyConfig_SetArgv()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetArgv)
- [`PyConfig_SetBytesArgv()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetBytesArgv)
- [`PyConfig_SetBytesString()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetBytesString)
- [`PyConfig_SetString()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetString)
- [`PyConfig_SetWideStringList()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetWideStringList)
- [`PyPreConfig_InitIsolatedConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig_InitIsolatedConfig)
- [`PyPreConfig_InitPythonConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig_InitPythonConfig)
- [`PyStatus_Error()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Error)
- [`PyStatus_Exception()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Exception)
- [`PyStatus_Exit()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Exit)
- [`PyStatus_IsError()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_IsError)
- [`PyStatus_IsExit()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_IsExit)
- [`PyStatus_NoMemory()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_NoMemory)
- [`PyStatus_Ok()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Ok)
- [`PyWideStringList_Append()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList_Append)
- [`PyWideStringList_Insert()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList_Insert)
- [`Py_ExitStatusException()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_ExitStatusException)
- [`Py_InitializeFromConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_InitializeFromConfig)
- [`Py_PreInitialize()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_PreInitialize)
- [`Py_PreInitializeFromArgs()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_PreInitializeFromArgs)
- [`Py_PreInitializeFromBytesArgs()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_PreInitializeFromBytesArgs)
- [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain)

Предварительная конфигурация (тип `PyPreConfig`) хранится в `_PyRuntime.preconfig`, а конфигурация (тип `PyConfig`) – в `PyInterpreterState.config`.

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

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

## PyWideStringList

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

**`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)`

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

#### `PyStatus PyStatus_NoMemory(void)`

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

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

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

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

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

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

**`PyPreConfig`**

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

- Установка распределителя памяти Python
- Настройка локали LC\_CTYPE
- Установка режима UTF-8

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

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

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

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

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

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

**int `allocator`**

Имя аллокатора памяти:

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

`PYMEM_ALLOCATOR_PYMALLOC` и `PYMEM_ALLOCATOR_PYMALLOC_DEBUG` не поддерживаются, если Python сконфигурирован с помощью `--without-pymalloc`

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

**int `configure_locale`**

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

**int `coerce_c_locale`**

Если равно 2, принудительно изменить локаль C; если равно 1, считать локаль LC\_CTYPE, чтобы решить, нужно ли её принудительно изменять.

**int `coerce_c_locale_warn`**

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

**int `dev_mode`**

См. [`PyConfig.dev_mode`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.dev_mode).

**int `isolated`**

См. [`PyConfig.isolated`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.isolated).

**int `legacy_windows_fs_encoding`(Windows *only*)**

Если не равно нулю, отключить режим UTF-8, установить файловую кодировку Python в `mbcs`, установить обработчик ошибок файловой системы в `replace`.

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

**int `parse_argv`**

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

**int `use_environment`**

См. [`PyConfig.use_environment`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.use_environment).

**int `utf8_mode`**

Если не равно нулю, включить режим UTF-8.

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

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

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

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

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

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

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

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

Вызывающий код отвечает за обработку исключений (ошибка или выход) с помощью [`PyStatus_Exception()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Exception) и [`Py_ExitStatusException()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_ExitStatusException).

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

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

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

Пример использования предварительной инициализации для включения режима UTF-8:

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

**`PyConfig`**

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

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

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

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

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

Инициализирует конфигурацию с помощью [Изолированной конфигурации](https://python-all.ru/3.8/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.

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

Декодировать *str* с помощью `Py_DecodeLocale()` и поместить результат в `*config_str`.

При необходимости предварительно инициализировать Python.

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

Устанавливает аргументы командной строки из wide character строк.

При необходимости предварительно инициализировать Python.

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

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

При необходимости предварительно инициализировать Python.

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

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

При необходимости предварительно инициализировать Python.

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

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

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

При необходимости предварительно инициализировать Python.

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

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

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

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

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

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

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

**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `argv`**

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

**wchar\_t\* `base_exec_prefix`**

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

**wchar\_t\* `base_executable`**

`sys._base_executable`: значение переменной окружения `__PYVENV_LAUNCHER__` или копия [`PyConfig.executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.executable).

**wchar\_t\* `base_prefix`**

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

**int `buffered_stdio`**

Если равно 0, включает небуферизированный режим, делая потоки stdout и stderr небуферизированными.

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

**int `bytes_warning`**

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

**wchar\_t\* `check_hash_pycs_mode`**

Управляет поведением проверки хешированных файлов `.pyc` (см. [**PEP 552**](https://python-all.ru/3.8/c-api/init_config.html)): значение параметра командной строки [`--check-hash-based-pycs`](https://python-all.ru/3.8/using/cmdline.html#cmdoption-check-hash-based-pycs).

Допустимые значения: `always`, `never` и `default`.

Значение по умолчанию: `default`.

**int `configure_c_stdio`**

Если ненулевое, настраивает стандартные потоки C (`stdio`, `stdout`, `stdout`). Например, устанавливает их режим в `O_BINARY` в Windows.

**int `dev_mode`**

Режим разработки: см. [`-X dev`](https://python-all.ru/3.8/using/cmdline.html#id5).

**int `dump_refs`**

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

Требуется отладочная сборка Python (макрос `Py_REF_DEBUG` должен быть определён).

**wchar\_t\* `exec_prefix`**

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

**wchar\_t\* `executable`**

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

**int `faulthandler`**

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

**wchar\_t\* `filesystem_encoding`**

Кодировка файловой системы, [`sys.getfilesystemencoding()`](https://python-all.ru/3.8/library/sys.html#sys.getfilesystemencoding).

**wchar\_t\* `filesystem_errors`**

Ошибки кодировки файловой системы, [`sys.getfilesystemencodeerrors()`](https://python-all.ru/3.8/library/sys.html#sys.getfilesystemencodeerrors).

**unsigned long `hash_seed`**

**int `use_hash_seed`**

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

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

**wchar\_t\* `home`**

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

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

**int `import_time`**

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

**int `inspect`**

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

**int `install_signal_handlers`**

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

**int `interactive`**

Интерактивный режим.

**int `isolated`**

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

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

**int `legacy_windows_stdio`**

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

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

**int `malloc_stats`**

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

Параметр игнорируется, если Python собран с использованием `--without-pymalloc`.

**wchar\_t\* `pythonpath_env`**

Пути поиска модулей в виде строки, разделённой `DELIM` (`os.path.pathsep`).

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

**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `module_search_paths`**

**int `module_search_paths_set`**

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

**int `optimization_level`**

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

- 0: Оптимизатор peephole (а `__debug__` установлен в `True`)
- 1: Удалить утверждения, установить `__debug__` в `False`
- 2: Удалить docstrings

**int `parse_argv`**

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

**int `parser_debug`**

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

**int `pathconfig_warnings`**

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

**wchar\_t\* `prefix`**

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

**wchar\_t\* `program_name`**

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

**wchar\_t\* `pycache_prefix`**

[`sys.pycache_prefix`](https://python-all.ru/3.8/library/sys.html#sys.pycache_prefix): префикс кэша `.pyc`.

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

**int `quiet`**

Тихий режим. Например, не отображать сообщения об авторских правах и версии в интерактивном режиме.

**wchar\_t\* `run_command`**

Аргумент `python3 -c COMMAND`. Используется [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain).

**wchar\_t\* `run_filename`**

Аргумент `python3 FILENAME`. Используется [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain).

**wchar\_t\* `run_module`**

Аргумент `python3 -m MODULE`. Используется [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain).

**int `show_alloc_count`**

Показывать количество выделений при выходе?

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

Требуется специальная сборка Python с определённым макросом `COUNT_ALLOCS`.

**int `show_ref_count`**

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

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

Требуется отладочная сборка Python (макрос `Py_REF_DEBUG` должен быть определён).

**int `site_import`**

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

**int `skip_source_first_line`**

Пропустить первую строку исходного кода?

**wchar\_t\* `stdio_encoding`**

**wchar\_t\* `stdio_errors`**

Кодировка и ошибки кодировки для [`sys.stdin`](https://python-all.ru/3.8/library/sys.html#sys.stdin), [`sys.stdout`](https://python-all.ru/3.8/library/sys.html#sys.stdout) и [`sys.stderr`](https://python-all.ru/3.8/library/sys.html#sys.stderr).

**int `tracemalloc`**

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

**int `use_environment`**

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

**int `user_site_directory`**

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

**int `verbose`**

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

**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `warnoptions`**

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

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

**int `write_bytecode`**

Если не ноль, записывать файлы `.pyc`.

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

**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `xoptions`**

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

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

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

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

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

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

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

Вызывающий код отвечает за обработку исключений (ошибка или выход) с помощью [`PyStatus_Exception()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Exception) и [`Py_ExitStatusException()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_ExitStatusException).

Если `PyImport_FrozenModules`, `PyImport_AppendInittab()` или `PyImport_ExtendInittab()` используются, они должны быть установлены или вызваны после прединициализации Python и до инициализации Python.

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

```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 fail;
    }

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

fail:
    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()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig_InitIsolatedConfig) и [`PyConfig_InitIsolatedConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_InitIsolatedConfig) создают конфигурацию для изоляции Python от системы. Например, для встраивания Python в приложение.

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

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

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

Функции [`PyPreConfig_InitPythonConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig_InitPythonConfig) и [`PyConfig_InitPythonConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_InitPythonConfig) создают конфигурацию для сборки настраиваемого Python, который ведёт себя как обычный Python.

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

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

Пример настройки 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 fail;
    }

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

    return Py_RunMain();

fail:
    PyConfig_Clear(&config);
    if (PyStatus_IsExit(status)) {
        return status.exitcode;
    }
    /* Вывести сообщение об ошибке и завершить процесс с
       ненулевым кодом выхода */
    Py_ExitStatusException(status);
}
```

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

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

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

  - [`PyConfig.home`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.home)
  - [`PyConfig.pathconfig_warnings`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.pathconfig_warnings)
  - [`PyConfig.program_name`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.program_name)
  - [`PyConfig.pythonpath_env`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.pythonpath_env)
  - текущий рабочий каталог: для получения абсолютных путей
  - переменная окружения `PATH` для получения полного пути программы (из [`PyConfig.program_name`](https://python-all.ru/3.8/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.8/c-api/init_config.html#c.PyConfig.base_exec_prefix)
  - [`PyConfig.base_executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.base_executable)
  - [`PyConfig.base_prefix`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.base_prefix)
  - [`PyConfig.exec_prefix`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.exec_prefix)
  - [`PyConfig.executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.executable)
  - [`PyConfig.module_search_paths_set`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.module_search_paths_set), [`PyConfig.module_search_paths`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.module_search_paths)
  - [`PyConfig.prefix`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.prefix)

Если хотя бы одно «выходное поле» не установлено, Python вычисляет конфигурацию пути, чтобы заполнить неустановленные поля. Если [`module_search_paths_set`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.module_search_paths_set) равно 0, [`module_search_paths`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.module_search_paths) переопределяется и [`module_search_paths_set`](https://python-all.ru/3.8/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.8/c-api/init_config.html#c.PyConfig.pathconfig_warnings) в 0, чтобы подавить предупреждения при вычислении конфигурации пути (только Unix; Windows не выводит предупреждения).

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

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

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

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

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

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

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

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

## Py\_RunMain()

#### `int Py_RunMain(void)`

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

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

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

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

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

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

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

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

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

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

- `PyConfig._init_main`: если установлено в 0, [`Py_InitializeFromConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_InitializeFromConfig) останавливается на фазе инициализации «Core».

#### `PyStatus _Py_InitializeMain(void)`

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

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

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