init_config.md
1> **Источник:** https://python-all.ru/3.8/c-api/init_config.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Конфигурация инициализации Python89Новое в версии 3.8.1011Структуры:1213- [`PyConfig`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig)14- [`PyPreConfig`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig)15- [`PyStatus`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus)16- [`PyWideStringList`](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList)1718Функции:1920- [`PyConfig_Clear()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_Clear)21- [`PyConfig_InitIsolatedConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_InitIsolatedConfig)22- [`PyConfig_InitPythonConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_InitPythonConfig)23- [`PyConfig_Read()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_Read)24- [`PyConfig_SetArgv()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetArgv)25- [`PyConfig_SetBytesArgv()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetBytesArgv)26- [`PyConfig_SetBytesString()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetBytesString)27- [`PyConfig_SetString()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetString)28- [`PyConfig_SetWideStringList()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig_SetWideStringList)29- [`PyPreConfig_InitIsolatedConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig_InitIsolatedConfig)30- [`PyPreConfig_InitPythonConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyPreConfig_InitPythonConfig)31- [`PyStatus_Error()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Error)32- [`PyStatus_Exception()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Exception)33- [`PyStatus_Exit()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Exit)34- [`PyStatus_IsError()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_IsError)35- [`PyStatus_IsExit()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_IsExit)36- [`PyStatus_NoMemory()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_NoMemory)37- [`PyStatus_Ok()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyStatus_Ok)38- [`PyWideStringList_Append()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList_Append)39- [`PyWideStringList_Insert()`](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList_Insert)40- [`Py_ExitStatusException()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_ExitStatusException)41- [`Py_InitializeFromConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_InitializeFromConfig)42- [`Py_PreInitialize()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_PreInitialize)43- [`Py_PreInitializeFromArgs()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_PreInitializeFromArgs)44- [`Py_PreInitializeFromBytesArgs()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_PreInitializeFromBytesArgs)45- [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain)4647Предварительная конфигурация (тип `PyPreConfig`) хранится в `_PyRuntime.preconfig`, а конфигурация (тип `PyConfig`) – в `PyInterpreterState.config`.4849См. также [Инициализация, финализация и потоки](https://python-all.ru/3.8/c-api/init.html#initialization).5051> **См. также**52>53> [**PEP 587**](https://python-all.ru/3.8/c-api/init_config.html) “Конфигурация инициализации Python”.5455## PyWideStringList5657**`PyWideStringList`**5859Список строк `wchar_t*`.6061Если *length* не равно нулю, *items* должен быть не `NULL`, а все строки должны быть\\nне `NULL`.6263Методы:6465#### `PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)`6667Добавляет *item* в *list*.6869Для вызова этой функции Python должен быть предварительно инициализирован.7071#### `PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)`7273Вставляет *item* в *list* по индексу *index*.7475Если *index* больше или равен длине *list*, добавляет *item* в\\n*list*.7677*index* должен быть больше или равен 0.7879Для вызова этой функции Python должен быть предварительно инициализирован.8081Поля структуры:8283**Py\_ssize\_t `length`**8485Длина списка.8687**wchar\_t\*\* `items`**8889Элементы списка.9091## PyStatus9293**`PyStatus`**9495Структура для хранения состояния функции инициализации: успех, ошибка\\nили завершение.9697В случае ошибки может хранить имя C-функции, вызвавшей ошибку.9899Поля структуры:100101**int `exitcode`**102103Код выхода. Аргумент, передаваемый в `exit()`.104105**const char \*`err_msg`**106107Сообщение об ошибке.108109**const char \*`func`**110111Имя функции, создавшей ошибку, может быть `NULL`.112113Функции создания статуса:114115#### `PyStatus PyStatus_Ok(void)`116117Успех.118119#### `PyStatus PyStatus_Error(const char *err_msg)`120121Ошибка инициализации с сообщением.122123#### `PyStatus PyStatus_NoMemory(void)`124125Сбой выделения памяти (не хватает памяти).126127#### `PyStatus PyStatus_Exit(int exitcode)`128129Завершить Python с указанным кодом выхода.130131Функции обработки статуса:132133#### `int PyStatus_Exception(PyStatus status)`134135Является ли статус ошибкой или выходом? Если да, исключение должно быть обработано, например, вызовом [`Py_ExitStatusException()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_ExitStatusException).136137#### `int PyStatus_IsError(PyStatus status)`138139Является ли результат ошибкой?140141#### `int PyStatus_IsExit(PyStatus status)`142143Является ли результат выходом?144145#### `void Py_ExitStatusException(PyStatus status)`146147Вызвать `exit(exitcode)`, если *status* – это выход. Вывести сообщение об ошибке и завершиться с ненулевым кодом выхода, если *status* – это ошибка. Должна вызываться, только если `PyStatus_Exception(status)` не равен нулю.148149> **Примечание**150>151> Внутренне Python использует макросы, которые устанавливают `PyStatus.func`, тогда как функции создания статуса устанавливают `func` в `NULL`.152153Пример:154155```c156PyStatus alloc(void **ptr, size_t size)157{158 *ptr = PyMem_RawMalloc(size);159 if (*ptr == NULL) {160 return PyStatus_NoMemory();161 }162 return PyStatus_Ok();163}164165int main(int argc, char **argv)166{167 void *ptr;168 PyStatus status = alloc(&ptr, 16);169 if (PyStatus_Exception(status)) {170 Py_ExitStatusException(status);171 }172 PyMem_Free(ptr);173 return 0;174}175```176177## PyPreConfig178179**`PyPreConfig`**180181Структура, используемая для предварительной инициализации Python:182183- Установка распределителя памяти Python184- Настройка локали LC\_CTYPE185- Установка режима UTF-8186187Функция инициализации предварительной конфигурации:188189#### `void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)`190191Инициализировать предварительную конфигурацию с [Конфигурацией Python](https://python-all.ru/3.8/c-api/init_config.html#init-python-config).192193#### `void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)`194195Инициализировать предварительную конфигурацию с [Изолированной конфигурацией](https://python-all.ru/3.8/c-api/init_config.html#init-isolated-conf).196197Поля структуры:198199**int `allocator`**200201Имя аллокатора памяти:202203- `PYMEM_ALLOCATOR_NOT_SET` (`0`): не менять распределители памяти (использовать по умолчанию)204- `PYMEM_ALLOCATOR_DEFAULT` (`1`): распределители памяти по умолчанию205- `PYMEM_ALLOCATOR_DEBUG` (`2`): распределители памяти по умолчанию с отладочными хуками206- `PYMEM_ALLOCATOR_MALLOC` (`3`): принудительно использовать `malloc()`207- `PYMEM_ALLOCATOR_MALLOC_DEBUG` (`4`): принудительно использовать `malloc()` с отладочными хуками208- `PYMEM_ALLOCATOR_PYMALLOC` (`5`): [аллокатор памяти Python pymalloc](https://python-all.ru/3.8/c-api/memory.html#pymalloc)209- `PYMEM_ALLOCATOR_PYMALLOC_DEBUG` (`6`): [Python pymalloc аллокатор памяти](https://python-all.ru/3.8/c-api/memory.html#pymalloc) с отладочными хуками210211`PYMEM_ALLOCATOR_PYMALLOC` и `PYMEM_ALLOCATOR_PYMALLOC_DEBUG` не поддерживаются, если Python сконфигурирован с помощью `--without-pymalloc`212213См. [Управление памятью](https://python-all.ru/3.8/c-api/memory.html#memory).214215**int `configure_locale`**216217Установить локаль LC\_CTYPE в предпочтительную пользователем локаль? Если равно 0, установить `coerce_c_locale` и `coerce_c_locale_warn` в 0.218219**int `coerce_c_locale`**220221Если равно 2, принудительно изменить локаль C; если равно 1, считать локаль LC\_CTYPE, чтобы решить, нужно ли её принудительно изменять.222223**int `coerce_c_locale_warn`**224225Если не равно нулю, выводит предупреждение при принудительном переключении локали C.226227**int `dev_mode`**228229См. [`PyConfig.dev_mode`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.dev_mode).230231**int `isolated`**232233См. [`PyConfig.isolated`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.isolated).234235**int `legacy_windows_fs_encoding`(Windows *only*)**236237Если не равно нулю, отключить режим UTF-8, установить файловую кодировку Python в `mbcs`, установить обработчик ошибок файловой системы в `replace`.238239Доступно только в Windows. Макрос `#ifdef MS_WINDOWS` можно использовать для кода, зависящего от Windows.240241**int `parse_argv`**242243Если не равно нулю, [`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).244245**int `use_environment`**246247См. [`PyConfig.use_environment`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.use_environment).248249**int `utf8_mode`**250251Если не равно нулю, включить режим UTF-8.252253## Предварительная инициализация с PyPreConfig254255Функции для предварительной инициализации Python:256257#### `PyStatus Py_PreInitialize(const PyPreConfig *preconfig)`258259Преинициализировать Python из предварительной конфигурации *preconfig*.260261#### `PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv)`262263Предварительно инициализировать Python из предварительной конфигурации *preconfig* и аргументов командной строки (байтовые строки).264265#### `PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv)`266267Предварительно инициализировать Python из предварительной конфигурации *preconfig* и аргументов командной строки (широкие строки).268269Вызывающий код отвечает за обработку исключений (ошибка или выход) с помощью [`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).270271Для [конфигурации 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.272273`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`.274275Функции распределения памяти 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) не должна вызываться до предварительной инициализации.276277Пример использования предварительной инициализации для включения режима UTF-8:278279```c280PyStatus status;281PyPreConfig preconfig;282PyPreConfig_InitPythonConfig(&preconfig);283284preconfig.utf8_mode = 1;285286status = Py_PreInitialize(&preconfig);287if (PyStatus_Exception(status)) {288 Py_ExitStatusException(status);289}290291/* на этом этапе Python будет использовать UTF-8 */292293Py_Initialize();294/* ... использовать Python API здесь ... */295Py_Finalize();296```297298## PyConfig299300**`PyConfig`**301302Структура, содержащая большинство параметров для настройки Python.303304Методы структуры:305306#### `void PyConfig_InitPythonConfig(PyConfig *config)`307308Инициализирует конфигурацию с помощью [Конфигурации Python](https://python-all.ru/3.8/c-api/init_config.html#init-python-config).309310#### `void PyConfig_InitIsolatedConfig(PyConfig *config)`311312Инициализирует конфигурацию с помощью [Изолированной конфигурации](https://python-all.ru/3.8/c-api/init_config.html#init-isolated-conf).313314#### `PyStatus PyConfig_SetString(PyConfig *config, wchar_t * const *config_str, const wchar_t *str)`315316Копировать широкую строку *str* в `*config_str`.317318При необходимости предварительно инициализировать Python.319320#### `PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t * const *config_str, const char *str)`321322Декодировать *str* с помощью `Py_DecodeLocale()` и поместить результат в `*config_str`.323324При необходимости предварительно инициализировать Python.325326#### `PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t * const *argv)`327328Устанавливает аргументы командной строки из wide character строк.329330При необходимости предварительно инициализировать Python.331332#### `PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char * const *argv)`333334Устанавливает аргументы командной строки: декодирует байты с помощью [`Py_DecodeLocale()`](https://python-all.ru/3.8/c-api/sys.html#c.Py_DecodeLocale).335336При необходимости предварительно инициализировать Python.337338#### `PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)`339340Задать список широких строк *list* с длиной *length* и элементами *items*.341342При необходимости предварительно инициализировать Python.343344#### `PyStatus PyConfig_Read(PyConfig *config)`345346Считывает всю конфигурацию Python.347348Поля, которые уже инициализированы, остаются без изменений.349350При необходимости предварительно инициализировать Python.351352#### `void PyConfig_Clear(PyConfig *config)`353354Освобождает память конфигурации.355356Большинство методов `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):357358- [`dev_mode`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.dev_mode)359- [`isolated`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.isolated)360- [`parse_argv`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.parse_argv)361- [`use_environment`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.use_environment)362363Более того, если используется [`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` не равно нулю).364365Вызывающий эти методы отвечает за обработку исключений (ошибка или выход) с помощью `PyStatus_Exception()` и `Py_ExitStatusException()`.366367Поля структуры:368369**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `argv`**370371Аргументы командной строки, [`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) всегда существует и никогда не пуст.372373**wchar\_t\* `base_exec_prefix`**374375[`sys.base_exec_prefix`](https://python-all.ru/3.8/library/sys.html#sys.base_exec_prefix).376377**wchar\_t\* `base_executable`**378379`sys._base_executable`: значение переменной окружения `__PYVENV_LAUNCHER__` или копия [`PyConfig.executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.executable).380381**wchar\_t\* `base_prefix`**382383[`sys.base_prefix`](https://python-all.ru/3.8/library/sys.html#sys.base_prefix).384385**int `buffered_stdio`**386387Если равно 0, включает небуферизированный режим, делая потоки stdout и stderr небуферизированными.388389stdin всегда открывается в буферизированном режиме.390391**int `bytes_warning`**392393Если равно 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).394395**wchar\_t\* `check_hash_pycs_mode`**396397Управляет поведением проверки хешированных файлов `.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).398399Допустимые значения: `always`, `never` и `default`.400401Значение по умолчанию: `default`.402403**int `configure_c_stdio`**404405Если ненулевое, настраивает стандартные потоки C (`stdio`, `stdout`, `stdout`). Например, устанавливает их режим в `O_BINARY` в Windows.406407**int `dev_mode`**408409Режим разработки: см. [`-X dev`](https://python-all.ru/3.8/using/cmdline.html#id5).410411**int `dump_refs`**412413Если не равно нулю, сбрасывать все объекты, которые все еще существуют при завершении.414415Требуется отладочная сборка Python (макрос `Py_REF_DEBUG` должен быть определён).416417**wchar\_t\* `exec_prefix`**418419[`sys.exec_prefix`](https://python-all.ru/3.8/library/sys.html#sys.exec_prefix).420421**wchar\_t\* `executable`**422423[`sys.executable`](https://python-all.ru/3.8/library/sys.html#sys.executable).424425**int `faulthandler`**426427Если не равно нулю, вызывается [`faulthandler.enable()`](https://python-all.ru/3.8/library/faulthandler.html#faulthandler.enable) при запуске.428429**wchar\_t\* `filesystem_encoding`**430431Кодировка файловой системы, [`sys.getfilesystemencoding()`](https://python-all.ru/3.8/library/sys.html#sys.getfilesystemencoding).432433**wchar\_t\* `filesystem_errors`**434435Ошибки кодировки файловой системы, [`sys.getfilesystemencodeerrors()`](https://python-all.ru/3.8/library/sys.html#sys.getfilesystemencodeerrors).436437**unsigned long `hash_seed`**438439**int `use_hash_seed`**440441Случайное зерно хеш-функции.442443Если [`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) игнорируется.444445**wchar\_t\* `home`**446447Домашний каталог Python.448449По умолчанию инициализируется из значения переменной окружения [`PYTHONHOME`](https://python-all.ru/3.8/using/cmdline.html#envvar-PYTHONHOME).450451**int `import_time`**452453Если не ноль, профилировать время импорта.454455**int `inspect`**456457Войти в интерактивный режим после выполнения скрипта или команды.458459**int `install_signal_handlers`**460461Установить обработчики сигналов?462463**int `interactive`**464465Интерактивный режим.466467**int `isolated`**468469Если значение больше 0, включить изолированный режим:470471- [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path) не содержит ни каталог скрипта (вычисленный из `argv[0]` или текущего каталога), ни каталог site-packages пользователя.472- REPL Python не импортирует [`readline`](https://python-all.ru/3.8/library/readline.html#module-readline) и не включает стандартную конфигурацию readline в интерактивных приглашениях.473- Установить [`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.474475**int `legacy_windows_stdio`**476477Если не ноль, использовать [`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).478479Доступно только в Windows. Макрос `#ifdef MS_WINDOWS` можно использовать для кода, зависящего от Windows.480481**int `malloc_stats`**482483Если не ноль, вывести статистику по [аллокатору памяти Python pymalloc](https://python-all.ru/3.8/c-api/memory.html#pymalloc) при завершении.484485Параметр игнорируется, если Python собран с использованием `--without-pymalloc`.486487**wchar\_t\* `pythonpath_env`**488489Пути поиска модулей в виде строки, разделённой `DELIM` (`os.path.pathsep`).490491По умолчанию инициализируется из значения переменной окружения [`PYTHONPATH`](https://python-all.ru/3.8/using/cmdline.html#envvar-PYTHONPATH).492493**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `module_search_paths`**494495**int `module_search_paths_set`**496497[`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).498499**int `optimization_level`**500501Уровень оптимизации компиляции:502503- 0: Оптимизатор peephole (а `__debug__` установлен в `True`)504- 1: Удалить утверждения, установить `__debug__` в `False`505- 2: Удалить docstrings506507**int `parse_argv`**508509Если не ноль, разбирать [`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).510511**int `parser_debug`**512513Если не ноль, включить отладочный вывод парсера (только для экспертов, зависит от опций компиляции).514515**int `pathconfig_warnings`**516517Если равно 0, подавлять предупреждения при вычислении [конфигурации путей](https://python-all.ru/3.8/c-api/init_config.html#init-path-config) (только Unix, Windows не записывает никаких предупреждений). В противном случае предупреждения записываются в `stderr`.518519**wchar\_t\* `prefix`**520521[`sys.prefix`](https://python-all.ru/3.8/library/sys.html#sys.prefix).522523**wchar\_t\* `program_name`**524525Имя программы. Используется для инициализации [`executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.executable) и в ранних сообщениях об ошибках.526527**wchar\_t\* `pycache_prefix`**528529[`sys.pycache_prefix`](https://python-all.ru/3.8/library/sys.html#sys.pycache_prefix): префикс кэша `.pyc`.530531Если `NULL`, [`sys.pycache_prefix`](https://python-all.ru/3.8/library/sys.html#sys.pycache_prefix) устанавливается в `None`.532533**int `quiet`**534535Тихий режим. Например, не отображать сообщения об авторских правах и версии в интерактивном режиме.536537**wchar\_t\* `run_command`**538539Аргумент `python3 -c COMMAND`. Используется [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain).540541**wchar\_t\* `run_filename`**542543Аргумент `python3 FILENAME`. Используется [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain).544545**wchar\_t\* `run_module`**546547Аргумент `python3 -m MODULE`. Используется [`Py_RunMain()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_RunMain).548549**int `show_alloc_count`**550551Показывать количество выделений при выходе?552553Устанавливается в 1 опцией командной строки [`-X showalloccount`](https://python-all.ru/3.8/using/cmdline.html#id5).554555Требуется специальная сборка Python с определённым макросом `COUNT_ALLOCS`.556557**int `show_ref_count`**558559Показывать общее количество ссылок при завершении?560561Устанавливается в 1 опцией командной строки [`-X showrefcount`](https://python-all.ru/3.8/using/cmdline.html#id5).562563Требуется отладочная сборка Python (макрос `Py_REF_DEBUG` должен быть определён).564565**int `site_import`**566567Импортировать модуль [`site`](https://python-all.ru/3.8/library/site.html#module-site) при запуске?568569**int `skip_source_first_line`**570571Пропустить первую строку исходного кода?572573**wchar\_t\* `stdio_encoding`**574575**wchar\_t\* `stdio_errors`**576577Кодировка и ошибки кодировки для [`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).578579**int `tracemalloc`**580581Если не равно нулю, вызывается [`tracemalloc.start()`](https://python-all.ru/3.8/library/tracemalloc.html#tracemalloc.start) при запуске.582583**int `use_environment`**584585Если больше 0, использовать [переменные окружения](https://python-all.ru/3.8/using/cmdline.html#using-on-envvars).586587**int `user_site_directory`**588589Если не ноль, добавить каталог пользовательского site в [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path).590591**int `verbose`**592593Если не ноль, включить подробный режим.594595**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `warnoptions`**596597[`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) для построения фильтров предупреждений: от низшего к высшему приоритету.598599Модуль [`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`, который проверяется первым (наивысший приоритет).600601**int `write_bytecode`**602603Если не ноль, записывать файлы `.pyc`.604605[`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).606607**[PyWideStringList](https://python-all.ru/3.8/c-api/init_config.html#c.PyWideStringList) `xoptions`**608609[`sys._xoptions`](https://python-all.ru/3.8/library/sys.html#sys._xoptions).610611Если `parse_argv` не ноль, то аргументы `argv` разбираются так же, как обычный Python разбирает аргументы командной строки, и аргументы Python удаляются из `argv`: см. [Аргументы командной строки](https://python-all.ru/3.8/using/cmdline.html#using-on-cmdline).612613Параметры `xoptions` разбираются для установки других параметров: см. параметр [`-X`](https://python-all.ru/3.8/using/cmdline.html#id5).614615## Инициализация с PyConfig616617Функция для инициализации Python:618619#### `PyStatus Py_InitializeFromConfig(const PyConfig *config)`620621Инициализирует Python из конфигурации *config*.622623Вызывающий код отвечает за обработку исключений (ошибка или выход) с помощью [`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).624625Если `PyImport_FrozenModules`, `PyImport_AppendInittab()` или `PyImport_ExtendInittab()` используются, они должны быть установлены или вызваны после прединициализации Python и до инициализации Python.626627Пример установки имени программы:628629```c630void init_python(void)631{632 PyStatus status;633634 PyConfig config;635 PyConfig_InitPythonConfig(&config);636637 /* Установить имя программы. Неявно предварительно инициализировать Python. */638 status = PyConfig_SetString(&config, &config.program_name,639 L"/path/to/my_program");640 if (PyStatus_Exception(status)) {641 goto fail;642 }643644 status = Py_InitializeFromConfig(&config);645 if (PyStatus_Exception(status)) {646 goto fail;647 }648 PyConfig_Clear(&config);649 return;650651fail:652 PyConfig_Clear(&config);653 Py_ExitStatusException(status);654}655```656657Более полный пример изменения конфигурации по умолчанию: чтение конфигурации и последующее переопределение некоторых параметров:658659```c660PyStatus init_python(const char *program_name)661{662 PyStatus status;663664 PyConfig config;665 PyConfig_InitPythonConfig(&config);666667 /* Установить имя программы перед чтением конфигурации668 (декодировать байтовую строку из кодировки локали).669670 Неявно предварительно инициализировать Python. */671 status = PyConfig_SetBytesString(&config, &config.program_name,672 program_name);673 if (PyStatus_Exception(status)) {674 goto done;675 }676677 /* Прочитать всю конфигурацию сразу */678 status = PyConfig_Read(&config);679 if (PyStatus_Exception(status)) {680 goto done;681 }682683 /* Добавляет пользовательский путь поиска в sys.path */684 status = PyWideStringList_Append(&config.module_search_paths,685 L"/path/to/more/modules");686 if (PyStatus_Exception(status)) {687 goto done;688 }689690 /* Переопределить исполняемый файл, вычисленный PyConfig_Read() */691 status = PyConfig_SetString(&config, &config.executable,692 L"/path/to/my_executable");693 if (PyStatus_Exception(status)) {694 goto done;695 }696697 status = Py_InitializeFromConfig(&config);698699done:700 PyConfig_Clear(&config);701 return status;702}703```704705## Изолированная конфигурация706707Функции [`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 в приложение.708709Эта конфигурация игнорирует глобальные переменные конфигурации, переменные окружения, аргументы командной строки ([`PyConfig.argv`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.argv) не разбирается) и пользовательский каталог сайтов. Стандартные потоки C (например, `stdout`) и локаль LC\_CTYPE остаются без изменений. Обработчики сигналов не устанавливаются.710711Конфигурационные файлы всё ещё используются с этой конфигурацией. Установите [Path Configuration](https://python-all.ru/3.8/c-api/init_config.html#init-path-config) («выходные поля») в значение, игнорирующее эти конфигурационные файлы, чтобы функция не вычисляла конфигурацию путей по умолчанию.712713## Конфигурация Python714715Функции [`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.716717Переменные окружения и аргументы командной строки используются для настройки Python, тогда как глобальные переменные конфигурации игнорируются.718719Эта функция включает принудительное использование локали 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).720721Пример настройки Python для постоянной работы в изолированном режиме:722723```c724int main(int argc, char **argv)725{726 PyStatus status;727728 PyConfig config;729 PyConfig_InitPythonConfig(&config);730 config.isolated = 1;731732 /* Декодировать аргументы командной строки.733 Неявно предварительно инициализировать Python (в изолированном режиме). */734 status = PyConfig_SetBytesArgv(&config, argc, argv);735 if (PyStatus_Exception(status)) {736 goto fail;737 }738739 status = Py_InitializeFromConfig(&config);740 if (PyStatus_Exception(status)) {741 goto fail;742 }743 PyConfig_Clear(&config);744745 return Py_RunMain();746747fail:748 PyConfig_Clear(&config);749 if (PyStatus_IsExit(status)) {750 return status.exitcode;751 }752 /* Вывести сообщение об ошибке и завершить процесс с753 ненулевым кодом выхода */754 Py_ExitStatusException(status);755}756```757758## Конфигурация путей759760[`PyConfig`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig) содержит несколько полей для конфигурации путей:761762- Входные данные конфигурации путей:763764 - [`PyConfig.home`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.home)765 - [`PyConfig.pathconfig_warnings`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.pathconfig_warnings)766 - [`PyConfig.program_name`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.program_name)767 - [`PyConfig.pythonpath_env`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.pythonpath_env)768 - текущий рабочий каталог: для получения абсолютных путей769 - переменная окружения `PATH` для получения полного пути программы (из [`PyConfig.program_name`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.program_name))770 - переменная окружения `__PYVENV_LAUNCHER__`771 - (только Windows) Пути приложений в реестре в разделе “SoftwarePythonPythonCoreX.YPythonPath” для HKEY\_CURRENT\_USER и HKEY\_LOCAL\_MACHINE (где X.Y – версия Python).772- Выходные поля конфигурации путей:773774 - [`PyConfig.base_exec_prefix`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.base_exec_prefix)775 - [`PyConfig.base_executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.base_executable)776 - [`PyConfig.base_prefix`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.base_prefix)777 - [`PyConfig.exec_prefix`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.exec_prefix)778 - [`PyConfig.executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.executable)779 - [`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)780 - [`PyConfig.prefix`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.prefix)781782Если хотя бы одно «выходное поле» не установлено, 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.783784Можно полностью игнорировать функцию вычисления конфигурации пути по умолчанию, явно задав все перечисленные выше выходные поля конфигурации пути. Строка считается установленной, даже если она непуста. `module_search_paths` считается установленным, если `module_search_paths_set` установлено в 1. В этом случае входные поля конфигурации пути также игнорируются.785786Установите [`pathconfig_warnings`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.pathconfig_warnings) в 0, чтобы подавить предупреждения при вычислении конфигурации пути (только Unix; Windows не выводит предупреждения).787788Если поля [`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) соответственно.789790[`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):791792- Если [`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).793- Если [`isolated`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.isolated) равно нулю:794795 - Если [`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). Ничего не делайте, если текущий каталог не может быть прочитан.796 - Если [`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).797 - В противном случае пустая строка добавляется в начало [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path).798799Если [`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).800801При конфигурации путей используются следующие файлы конфигурации:802803- `pyvenv.cfg`804- `python._pth` (только Windows)805- `pybuilddir.txt` (только Unix)806807Переменная окружения `__PYVENV_LAUNCHER__` используется для установки [`PyConfig.base_executable`](https://python-all.ru/3.8/c-api/init_config.html#c.PyConfig.base_executable).808809## Py\_RunMain()810811#### `int Py_RunMain(void)`812813Выполняет команду ([`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)), указанные в командной строке или в конфигурации.814815По умолчанию, а также при использовании опции [`-i`](https://python-all.ru/3.8/using/cmdline.html#cmdoption-i), запускается REPL.816817Наконец, завершает работу Python и возвращает код завершения, который можно передать функции `exit()`.818819См. [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).820821## Многофазная инициализация (частный временный API)822823Этот раздел представляет собой частный временный API, вводящий многофазную инициализацию, ключевую возможность [**PEP 432**](https://python-all.ru/3.8/c-api/init_config.html):824825- Фаза «базовой» инициализации, «минимальный Python»:826827 - Встроенные типы;828 - Встроенные исключения;829 - Встроенные и замороженные модули;830 - Модуль [`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) ещё не существует).831- Фаза «основной» инициализации, Python полностью инициализирован:832833 - Устанавливает и настраивает [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib);834 - Применяет [конфигурацию путей](https://python-all.ru/3.8/c-api/init_config.html#init-path-config);835 - Устанавливает обработчики сигналов;836 - Завершает инициализацию модуля [`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));837 - Включает опциональные возможности, такие как [`faulthandler`](https://python-all.ru/3.8/library/faulthandler.html#module-faulthandler) и [`tracemalloc`](https://python-all.ru/3.8/library/tracemalloc.html#module-tracemalloc);838 - Импортировать модуль [`site`](https://python-all.ru/3.8/library/site.html#module-site);839 - и т. д.840841Частный временный API:842843- `PyConfig._init_main`: если установлено в 0, [`Py_InitializeFromConfig()`](https://python-all.ru/3.8/c-api/init_config.html#c.Py_InitializeFromConfig) останавливается на фазе инициализации «Core».844845#### `PyStatus _Py_InitializeMain(void)`846847Переход к фазе инициализации «Main», завершение инициализации Python.848849Во время фазы «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) или хук импорта и т. д.850851Возможно, станет возможным вычислять [конфигурацию путей](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).852853Фаза «Core» не определена должным образом: что должно и что не должно быть доступно на этой фазе, пока не указано. API помечен как частный и временный: API может быть изменён или даже удалён в любое время, пока не будет спроектирован надлежащий публичный API.854855Пример выполнения кода Python между фазами инициализации «Core» и «Main»:856857```c858void init_python(void)859{860 PyStatus status;861862 PyConfig config;863 PyConfig_InitPythonConfig(&config);864 config._init_main = 0;865866 /* настроить конфигурацию 'config' */867868 status = Py_InitializeFromConfig(&config);869 PyConfig_Clear(&config);870 if (PyStatus_Exception(status)) {871 Py_ExitStatusException(status);872 }873874 /* ... разместить здесь дополнительный код конфигурации ...875 вызывается _Py_InitializeMain() */876 int res = PyRun_SimpleString(877 "import sys; "878 "print('Run Python code before _Py_InitializeMain', "879 "file=sys.stderr)");880 if (res < 0) {881 exit(1);882 }883884 /* ... добавьте сюда дополнительный код конфигурации ... */885886 status = _Py_InitializeMain();887 if (PyStatus_Exception(status)) {888 Py_ExitStatusException(status);889 }890}891```892