interp-lifecycle.md
1> **Источник:** https://python-all.ru/3.16/c-api/interp-lifecycle.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Инициализация и финализация интерпретатора89Подробнее о том, как настроить интерпретатор до инициализации, см. в [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).1011## До инициализации Python1213В приложении, встраивающем Python, функция [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize) должна вызываться до использования любых других функций Python/C API; за исключением нескольких функций и [глобальных переменных конфигурации](https://python-all.ru/3.16/c-api/interp-lifecycle.html#global-conf-vars).1415Следующие функции можно безопасно вызывать до инициализации Python:1617- Функции, инициализирующие интерпретатор:1819 - [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize)20 - [`Py_InitializeEx()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_InitializeEx)21 - [`Py_InitializeFromConfig()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_InitializeFromConfig)22 - [`Py_BytesMain()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_BytesMain)23 - [`Py_Main()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Main)24 - функции предварительной инициализации среды выполнения, описанные в [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config)25- Функции конфигурации:2627 - [`PyImport_AppendInittab()`](https://python-all.ru/3.16/c-api/import.html#c.PyImport_AppendInittab)28 - [`PyImport_ExtendInittab()`](https://python-all.ru/3.16/c-api/import.html#c.PyImport_ExtendInittab)29 - `PyInitFrozenExtensions()`30 - [`PyMem_SetAllocator()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_SetAllocator)31 - [`PyMem_SetupDebugHooks()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_SetupDebugHooks)32 - [`PyObject_SetArenaAllocator()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_SetArenaAllocator)33 - [`Py_SetProgramName()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_SetProgramName)34 - [`Py_SetPythonHome()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_SetPythonHome)35 - функции конфигурации, описанные в [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config)36- Информационные функции:3738 - [`Py_IsInitialized()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_IsInitialized)39 - [`PyMem_GetAllocator()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_GetAllocator)40 - [`PyObject_GetArenaAllocator()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_GetArenaAllocator)41 - [`Py_GetBuildInfo()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_GetBuildInfo)42 - [`Py_GetCompiler()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_GetCompiler)43 - [`Py_GetCopyright()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_GetCopyright)44 - [`Py_GetPlatform()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_GetPlatform)45 - [`Py_GetVersion()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_GetVersion)46 - [`Py_IsInitialized()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_IsInitialized)47- Утилиты:4849 - [`Py_DecodeLocale()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_DecodeLocale)50 - функции сообщения о состоянии и утилиты, описанные в [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config)51- Распределители памяти:5253 - [`PyMem_RawMalloc()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_RawMalloc)54 - [`PyMem_RawRealloc()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_RawRealloc)55 - [`PyMem_RawCalloc()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_RawCalloc)56 - [`PyMem_RawFree()`](https://python-all.ru/3.16/c-api/memory.html#c.PyMem_RawFree)57- Синхронизация:5859 - [`PyMutex_Lock()`](https://python-all.ru/3.16/c-api/synchronization.html#c.PyMutex_Lock)60 - [`PyMutex_Unlock()`](https://python-all.ru/3.16/c-api/synchronization.html#c.PyMutex_Unlock)6162> **Примечание**63>64> Несмотря на внешнее сходство с некоторыми из перечисленных выше функций, следующие функции **не следует вызывать** до инициализации интерпретатора: [`Py_EncodeLocale()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_EncodeLocale), [`PyEval_InitThreads()`](https://python-all.ru/3.16/c-api/threads.html#c.PyEval_InitThreads) и [`Py_RunMain()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_RunMain).6566## Глобальные переменные конфигурации6768В Python есть переменные глобальной конфигурации, управляющие различными возможностями и настройками. По умолчанию эти флаги задаются [параметрами командной строки](https://python-all.ru/3.16/using/cmdline.html#using-on-interface-options).6970Когда флаг устанавливается через параметр, значение флага равно количеству раз, которое этот параметр был указан. Например, `-b` устанавливает [`Py_BytesWarningFlag`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_BytesWarningFlag) в 1, а `-bb` устанавливает `Py_BytesWarningFlag` в 2.7172#### `int Py_BytesWarningFlag`7374Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.bytes_warning`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.bytes_warning), см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).7576Выдавать предупреждение при сравнении [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) или [`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray) с [`str`](https://python-all.ru/3.16/library/stdtypes.html#str) или `bytes` с [`int`](https://python-all.ru/3.16/library/functions.html#int). Если значение больше или равно `2`, выдавать ошибку.7778Устанавливается параметром [`-b`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-b).7980Устарело с версии 3.12, удалено в версии 3.16.8182#### `int Py_DebugFlag`8384Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.parser_debug`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.parser_debug); см. [конфигурацию инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).8586Включает отладочный вывод парсера (только для экспертов, зависит от опций компиляции).8788Устанавливается параметром [`-d`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-d) и переменной окружения [`PYTHONDEBUG`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONDEBUG).8990Устарело с версии 3.12, удалено в версии 3.16.9192#### `int Py_DontWriteBytecodeFlag`9394Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.write_bytecode`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.write_bytecode); см. [конфигурацию инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).9596Если установлено ненулевое значение, Python не будет пытаться записывать файлы `.pyc` при импорте исходных модулей.9798Устанавливается параметром [`-B`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-B) и переменной окружения [`PYTHONDONTWRITEBYTECODE`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE).99100Устарело с версии 3.12, удалено в версии 3.16.101102#### `int Py_FrozenFlag`103104Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.pathconfig_warnings`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.pathconfig_warnings); см. [конфигурацию инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).105106Внутренний флаг, используемый программами `_freeze_module` и `frozenmain`.107108Устарело с версии 3.12, удалено в версии 3.16.109110#### `int Py_HashRandomizationFlag`111112Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.hash_seed`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.hash_seed) и [`PyConfig.use_hash_seed`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.use_hash_seed); см. [конфигурацию инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).113114Устанавливается в `1`, если переменная окружения [`PYTHONHASHSEED`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONHASHSEED) установлена в непустую строку.115116Если флаг ненулевой, читает переменную окружения [`PYTHONHASHSEED`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONHASHSEED) для инициализации секретного начального значения хеша.117118Устарело с версии 3.12, удалено в версии 3.16.119120#### `int Py_IgnoreEnvironmentFlag`121122Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.use_environment`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.use_environment); см. [конфигурацию инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).123124Игнорировать все переменные окружения `PYTHON*`, например [`PYTHONPATH`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONPATH) и [`PYTHONHOME`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONHOME), которые могли быть установлены.125126Устанавливается параметрами [`-E`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-E) и [`-I`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-I).127128Устарело с версии 3.12, удалено в версии 3.16.129130#### `int Py_InspectFlag`131132Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.inspect`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.inspect); см. [конфигурацию инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).133134Если скрипт передан первым аргументом или используется параметр [`-c`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-c), после выполнения скрипта или команды перейти в интерактивный режим, даже если [`sys.stdin`](https://python-all.ru/3.16/library/sys.html#sys.stdin) не является терминалом.135136Устанавливается параметром [`-i`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-i) и переменной окружения [`PYTHONINSPECT`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONINSPECT).137138Устарело с версии 3.12, удалено в версии 3.16.139140#### `int Py_InteractiveFlag`141142Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.interactive`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.interactive); см. [конфигурацию инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).143144Устанавливается параметром [`-i`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-i).145146Устарело с версии 3.12, удалено в версии 3.16.147148#### `int Py_IsolatedFlag`149150Этот API сохранён для обратной совместимости: следует использовать настройку [`PyConfig.isolated`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.isolated); см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).151152Запуск Python в изолированном режиме. В изолированном режиме [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) не содержит ни каталог скрипта, ни каталог site-packages пользователя.153154Устанавливается параметром [`-I`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-I).155156Добавлено в версии 3.4.157158Устарело с версии 3.12, удалено в версии 3.16.159160#### `int Py_LegacyWindowsFSEncodingFlag`161162Этот API сохранён для обратной совместимости: следует использовать настройку [`PyPreConfig.legacy_windows_fs_encoding`](https://python-all.ru/3.16/c-api/init_config.html#c.PyPreConfig.legacy_windows_fs_encoding); см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).163164Если флаг ненулевой, используется кодировка `mbcs` с обработчиком ошибок `replace` вместо кодировки UTF-8 с обработчиком ошибок `surrogatepass` для [кодировки файловой системы и обработчика ошибок](https://python-all.ru/3.16/glossary.html#term-filesystem-encoding-and-error-handler).165166Устанавливается в `1`, если переменная окружения [`PYTHONLEGACYWINDOWSFSENCODING`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONLEGACYWINDOWSFSENCODING) установлена в непустую строку.167168См. [**PEP 529**](https://python-all.ru/3.16/c-api/interp-lifecycle.html) для подробностей.169170[Доступность](https://python-all.ru/3.16/library/intro.html#availability): Windows.171172Устарело с версии 3.12, удалено в версии 3.16.173174#### `int Py_LegacyWindowsStdioFlag`175176Этот API сохранён для обратной совместимости: следует использовать настройку [`PyConfig.legacy_windows_stdio`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.legacy_windows_stdio); см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).177178Если флаг ненулевой, используется [`io.FileIO`](https://python-all.ru/3.16/library/io.html#io.FileIO) вместо `io._WindowsConsoleIO` для [`sys`](https://python-all.ru/3.16/library/sys.html#module-sys) стандартных потоков.179180Устанавливается в `1`, если переменная окружения [`PYTHONLEGACYWINDOWSSTDIO`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONLEGACYWINDOWSSTDIO) установлена в непустую строку.181182См. [**PEP 528**](https://python-all.ru/3.16/c-api/interp-lifecycle.html) для подробностей.183184[Доступность](https://python-all.ru/3.16/library/intro.html#availability): Windows.185186Устарело с версии 3.12, удалено в версии 3.16.187188#### `int Py_NoSiteFlag`189190Этот API сохранён для обратной совместимости: следует использовать настройку [`PyConfig.site_import`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.site_import); см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).191192Отключает импорт модуля [`site`](https://python-all.ru/3.16/library/site.html#module-site) и связанные с ним site-зависимые манипуляции с [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path). Также отключает эти манипуляции, если `site` явно импортирован позже (для их выполнения следует вызвать [`site.main()`](https://python-all.ru/3.16/library/site.html#site.main)).193194Устанавливается параметром [`-S`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-S).195196Устарело с версии 3.12, удалено в версии 3.16.197198#### `int Py_NoUserSiteDirectory`199200Этот API сохранён для обратной совместимости: следует использовать настройку [`PyConfig.user_site_directory`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.user_site_directory); см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).201202Не добавляет [`user site-packages directory`](https://python-all.ru/3.16/library/site.html#site.USER_SITE) в [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path).203204Устанавливается параметрами [`-s`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-s) и [`-I`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-I), а также переменной окружения [`PYTHONNOUSERSITE`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONNOUSERSITE).205206Устарело с версии 3.12, удалено в версии 3.16.207208#### `int Py_OptimizeFlag`209210Этот API сохранён для обратной совместимости: следует использовать настройку [`PyConfig.optimization_level`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.optimization_level); см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).211212Устанавливается параметром [`-O`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-O) и переменной окружения [`PYTHONOPTIMIZE`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONOPTIMIZE).213214Устарело с версии 3.12, удалено в версии 3.16.215216#### `int Py_QuietFlag`217218Этот API сохранён для обратной совместимости: вместо него следует использовать настройку [`PyConfig.quiet`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.quiet), см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).219220Не выводить сообщения об авторских правах и версии, даже в интерактивном режиме.221222Устанавливается опцией [`-q`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-q).223224Добавлено в версии 3.2.225226Устарело с версии 3.12, удалено в версии 3.16.227228#### `int Py_UnbufferedStdioFlag`229230Этот API сохранён для обратной совместимости: вместо него следует использовать настройку [`PyConfig.buffered_stdio`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.buffered_stdio), см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).231232Принудительно отключает буферизацию потоков stdout и stderr.233234Устанавливается опцией [`-u`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-u) и переменной окружения [`PYTHONUNBUFFERED`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONUNBUFFERED).235236Устарело с версии 3.12, удалено в версии 3.16.237238#### `int Py_VerboseFlag`239240Этот API сохранён для обратной совместимости: вместо него следует использовать настройку [`PyConfig.verbose`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.verbose), см. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).241242Выводит сообщение каждый раз при инициализации модуля, указывая, откуда он загружается (имя файла или встроенный модуль). Если значение больше или равно `2`, выводит сообщение для каждого файла, который проверяется при поиске модуля. Также предоставляет информацию об очистке модулей при завершении работы.243244Устанавливается опцией [`-v`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-v) и переменной окружения [`PYTHONVERBOSE`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONVERBOSE).245246Устарело с версии 3.12, удалено в версии 3.16.247248## Инициализация и завершение работы интерпретатора249250#### `void Py_Initialize()`251252*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*253254Инициализирует интерпретатор Python. В приложении, встраивающем Python, эту функцию следует вызывать до использования любых других функций Python/C API; исключения перечислены в разделе [Before Python Initialization](https://python-all.ru/3.16/c-api/interp-lifecycle.html#pre-init-safe).255256Эта функция инициализирует таблицу загруженных модулей (`sys.modules`) и создаёт фундаментальные модули [`builtins`](https://python-all.ru/3.16/library/builtins.html#module-builtins), [`__main__`](https://python-all.ru/3.16/library/__main__.html#module-__main__) и [`sys`](https://python-all.ru/3.16/library/sys.html#module-sys). Также она инициализирует путь поиска модулей (`sys.path`). Она не устанавливает `sys.argv`; для этого следует использовать API [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config). При повторном вызове (без предварительного вызова [`Py_FinalizeEx()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_FinalizeEx)) функция ничего не делает. Возвращаемого значения нет; если инициализация завершается ошибкой, это фатальная ошибка.257258Используйте [`Py_InitializeFromConfig()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_InitializeFromConfig) для настройки [конфигурации инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).259260> **Примечание**261>262> В Windows изменяет режим консоли с `O_TEXT` на `O_BINARY`, что также влияет на использование консоли не из Python через среду выполнения C.263264#### `void Py_InitializeEx(int initsigs)`265266*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*267268Эта функция работает как [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize), если *initsigs* равно `1`. Если *initsigs* равно `0`, она пропускает начальную регистрацию обработчиков сигналов, что может быть полезно, когда CPython встраивается в более крупное приложение.269270Используйте [`Py_InitializeFromConfig()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_InitializeFromConfig) для настройки [конфигурации инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).271272#### `PyStatus Py_InitializeFromConfig(const PyConfig *config)`273274Инициализирует Python из конфигурации *config*, как описано в [Initialization with PyConfig](https://python-all.ru/3.16/c-api/init_config.html#init-from-config).275276Подробнее о предварительной инициализации интерпретатора, заполнении структуры конфигурации времени выполнения и проверке возвращаемой структуры состояния см. в разделе [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).277278#### `int Py_IsInitialized()`279280*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*281282Возвращает true (ненулевое значение), если интерпретатор Python был инициализирован, и false (ноль), если нет. После вызова [`Py_FinalizeEx()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_FinalizeEx) функция возвращает false до тех пор, пока не будет снова вызвана [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize).283284Изменено в версии 3.15: Эта функция больше не возвращает true до полного завершения инициализации, включая импорт модуля [`site`](https://python-all.ru/3.16/library/site.html#module-site). Ранее она могла вернуть true, пока [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize) ещё выполнялся.285286#### `int Py_IsFinalizing()`287288*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable), начиная с версии 3.13.*289290Возвращает истину (не ноль), если главный интерпретатор Python [завершает работу](https://python-all.ru/3.16/glossary.html#term-interpreter-shutdown). В противном случае возвращает ложь (ноль).291292Добавлено в версии 3.13.293294#### `int Py_FinalizeEx()`295296*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.6.*297298Отменяет все инициализации, выполненные [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize) и последующее использование функций Python/C API, и уничтожает все под-интерпретаторы (см. [`Py_NewInterpreter()`](https://python-all.ru/3.16/c-api/subinterpreters.html#c.Py_NewInterpreter) ниже), которые были созданы и ещё не уничтожены после последнего вызова `Py_Initialize()`. При повторном вызове (без предварительного вызова `Py_Initialize()`) эта операция ничего не делает.299300Поскольку эта функция является обратной по отношению к [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize), её следует вызывать в том же потоке с тем же активным интерпретатором. Это означает главный поток и главный интерпретатор. Никогда не следует вызывать её во время работы [`Py_RunMain()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_RunMain).301302Обычно возвращаемое значение – `0`. Если во время завершения (сброса буферизованных данных) произошли ошибки, возвращается `-1`.303304Обратите внимание: Python делает всё возможное, чтобы освободить всю память, выделенную интерпретатором Python. Поэтому любое расширение на C должно корректно очищать все ранее выделенные объекты PyObject перед их использованием в последующих вызовах [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize). В противном случае это может привести к уязвимостям и некорректному поведению.305306Эта функция предусмотрена по ряду причин. Встраивающее приложение может захотеть перезапустить Python без перезапуска самого приложения. Приложение, загрузившее интерпретатор Python из динамически загружаемой библиотеки (или DLL), может захотеть освободить всю память, выделенную Python, перед выгрузкой DLL. В процессе поиска утечек памяти в приложении разработчик может захотеть освободить всю память, выделенную Python, перед выходом из приложения.307308**Ошибки и предостережения:** Уничтожение модулей и объектов в модулях выполняется в случайном порядке; это может привести к тому, что деструкторы (методы [`__del__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__del__)) будут завершаться ошибкой, если они зависят от других объектов (даже функций) или модулей. Динамически загружаемые модули расширений, загруженные Python, не выгружаются. Небольшие объёмы памяти, выделенные интерпретатором Python, могут не освобождаться (если вы нашли утечку, пожалуйста, сообщите о ней). Память, связанная циклическими ссылками между объектами, не освобождается. Интернированные строки будут освобождены независимо от их счётчика ссылок. Некоторая память, выделенная модулями расширений, может не освобождаться. Некоторые расширения могут работать неправильно, если их функция инициализации вызывается более одного раза; это может произойти, если приложение вызывает [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize) и [`Py_FinalizeEx()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_FinalizeEx) более одного раза. `Py_FinalizeEx()` не должна вызываться рекурсивно из самой себя. Поэтому её не должен вызывать любой код, который может быть выполнен в рамках процесса завершения работы интерпретатора, такой как обработчики [`atexit`](https://python-all.ru/3.16/library/atexit.html#module-atexit), финализаторы объектов или любой код, который может выполняться при сбросе файлов stdout и stderr.309310Возбуждает [событие аудита](https://python-all.ru/3.16/library/sys.html#auditing) `cpython._PySys_ClearAuditHooks` без аргументов.311312Добавлено в версии 3.6.313314#### `void Py_Finalize()`315316*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*317318Это обратно совместимая версия [`Py_FinalizeEx()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_FinalizeEx), которая игнорирует возвращаемое значение.319320#### `int Py_BytesMain(int argc, char **argv)`321322*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) с версии 3.8.*323324Аналогично [`Py_Main()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Main), но *argv* является массивом строк байтов, что позволяет вызывающему приложению делегировать этап декодирования текста среде выполнения CPython.325326Добавлено в версии 3.8.327328#### `int Py_Main(int argc, wchar_t **argv)`329330*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*331332Главная программа стандартного интерпретатора, инкапсулирующая полный цикл инициализации/завершения, а также дополнительное поведение для реализации чтения параметров конфигурации из окружения и командной строки, и затем выполнения `__main__` в соответствии с [командной строкой](https://python-all.ru/3.16/using/cmdline.html#using-on-cmdline).333334Эта функция доступна для программ, которые хотят поддерживать полный интерфейс командной строки CPython, а не просто встраивать среду выполнения Python в более крупное приложение.335336Параметры *argc* и *argv* аналогичны тем, которые передаются функции `main()` программы на C, за исключением того, что элементы *argv* сначала преобразуются в `wchar_t` с помощью [`Py_DecodeLocale()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_DecodeLocale). Также важно отметить, что записи списка аргументов могут быть изменены так, чтобы указывать на строки, отличные от переданных (однако содержимое строк, на которые указывает список аргументов, не изменяется).337338Возвращаемое значение – `2`, если список аргументов не представляет собой допустимую командную строку Python, и в противном случае то же, что и [`Py_RunMain()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_RunMain).339340С точки зрения API конфигурации среды выполнения CPython, описанных в разделе [runtime configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config) (и без учёта обработки ошибок), `Py_Main` примерно эквивалентно:341342```c343PyConfig config;344PyConfig_InitPythonConfig(&config);345PyConfig_SetArgv(&config, argc, argv);346Py_InitializeFromConfig(&config);347PyConfig_Clear(&config);348349Py_RunMain();350```351352В обычном использовании встраивающее приложение будет вызывать эту функцию *вместо* прямого вызова [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize), [`Py_InitializeEx()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_InitializeEx) или [`Py_InitializeFromConfig()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_InitializeFromConfig), и все настройки будут применены так, как описано в других разделах этой документации. Если эта функция вызывается *после* предыдущего вызова API инициализации среды выполнения, то то, какие именно настройки окружения и командной строки будут обновлены, зависит от версии (поскольку зависит от того, какие настройки корректно поддерживают изменение после того, как они были установлены один раз при первой инициализации среды выполнения).353354#### `int Py_RunMain(void)`355356Выполняет главный модуль в полностью сконфигурированной среде выполнения CPython.357358Выполняет команду ([`PyConfig.run_command`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.run_command)), скрипт ([`PyConfig.run_filename`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.run_filename)) или модуль ([`PyConfig.run_module`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.run_module)), указанные в командной строке или в конфигурации. Если ни одно из этих значений не задано, запускает интерактивный промпт Python (REPL) с использованием глобального пространства имён модуля `__main__`.359360Если [`PyConfig.inspect`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.inspect) не задан (по умолчанию), возвращаемое значение будет `0`, если интерпретатор завершается нормально (то есть без возбуждения исключения), кодом выхода необработанного [`SystemExit`](https://python-all.ru/3.16/library/exceptions.html#SystemExit), или `1` для любого другого необработанного исключения.361362Если [`PyConfig.inspect`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.inspect) задан (например, когда используется опция [`-i`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-i)), то вместо возврата при завершении интерпретатора выполнение продолжается в интерактивном промпте Python (REPL) с использованием глобального пространства имён модуля `__main__`. Если интерпретатор завершился с исключением, это исключение немедленно возбуждается в сессии REPL. Возвращаемое значение функции затем определяется способом завершения *сессии REPL*: `0`, `1` или статусом [`SystemExit`](https://python-all.ru/3.16/library/exceptions.html#SystemExit), как указано выше.363364Эта функция всегда завершает работу интерпретатора Python перед возвратом.365366См. [Конфигурация Python](https://python-all.ru/3.16/c-api/init_config.html#init-python-config) для примера пользовательской сборки Python, которая всегда работает в изолированном режиме с использованием [`Py_RunMain()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_RunMain).367368#### `int PyUnstable_AtExit(PyInterpreterState *interp, void (*func)(void*), void *data)`369370> *Это [нестабильное API](https://python-all.ru/3.16/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*371372Регистрирует колбэк [`atexit`](https://python-all.ru/3.16/library/atexit.html#module-atexit) для целевого интерпретатора *interp*. Это аналогично [`Py_AtExit()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_AtExit), но принимает явный указатель на интерпретатор и данные для колбэка.373374Должно существовать [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state) для *interp*.375376Добавлено в версии 3.13.377378## Предостережения относительно завершения работы интерпретатора379380На поздней стадии [завершения работы интерпретатора](https://python-all.ru/3.16/glossary.html#term-interpreter-shutdown), после попытки дождаться завершения потоков, не являющихся демонами (хотя это может быть прервано [`KeyboardInterrupt`](https://python-all.ru/3.16/library/exceptions.html#KeyboardInterrupt)) и выполнения функций [`atexit`](https://python-all.ru/3.16/library/atexit.html#module-atexit), среда выполнения помечается как завершающаяся, что означает, что [`Py_IsFinalizing()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_IsFinalizing) и [`sys.is_finalizing()`](https://python-all.ru/3.16/library/sys.html#sys.is_finalizing) возвращают истину. В этот момент только поток завершения (поток, который инициировал завершение; обычно это главный поток) может [присоединить](https://python-all.ru/3.16/glossary.html#term-attached-thread-state) состояние потока.381382Другие потоки, которые пытаются присоединиться во время завершения, явно (например, через [`PyThreadState_Ensure()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_Ensure) или [`Py_END_ALLOW_THREADS`](https://python-all.ru/3.16/c-api/threads.html#c.Py_END_ALLOW_THREADS)) или неявно (например, между инструкциями байт-кода), переходят в **постоянно заблокированное состояние**. Обычно это безвредно, но может привести к взаимоблокировкам. Например, поток может быть постоянно заблокирован, удерживая блокировку, что означает, что поток завершения никогда не сможет получить эту блокировку.383384До CPython 3.13 поток завершался, а не зависал, что приводило к другим проблемам (см. предупреждение в [`PyThread_exit_thread()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThread_exit_thread)).385386Грубо? Да. Начиная с Python 3.15, появилось несколько C API, которые позволяют избежать этих проблем, временно предотвращая финализацию:387388> **См. также**389>390> [**PEP 788**](https://python-all.ru/3.16/c-api/interp-lifecycle.html) описывает устройство, мотивацию и обоснование этих API.391392#### `type PyInterpreterGuard`393394*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) (как непрозрачная структура) начиная с версии 3.15.*395396Непрозрачная структура защиты интерпретатора.397398Удерживая защиту интерпретатора, вызывающая сторона может гарантировать, что интерпретатор не завершит финализацию, пока защита не будет закрыта (через [`PyInterpreterGuard_Close()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PyInterpreterGuard_Close)).399400Когда защита удерживается, поток, пытающийся завершить финализацию интерпретатора, будет заблокирован до закрытия защиты, прежде чем начнётся финализация. После начала финализации потоки уже никогда не смогут получить защиту для этого интерпретатора. Это означает, что если забыть закрыть защиту интерпретатора, процесс **навсегда зависнет** во время финализации!401402Удержание защиты для интерпретатора аналогично удержанию [сильной ссылки](https://python-all.ru/3.16/glossary.html#term-strong-reference) на объект Python, за исключением того, что финализация не происходит автоматически после освобождения всех защит: требуется явный вызов [`Py_EndInterpreter()`](https://python-all.ru/3.16/c-api/subinterpreters.html#c.Py_EndInterpreter).403404Добавлено в версии 3.15.405406#### `PyInterpreterGuard *PyInterpreterGuard_FromCurrent(void)`407408*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.15.*409410Создаёт защиту финализации для текущего интерпретатора. Это предотвратит финализацию до тех пор, пока защита не будет закрыта.411412Например:413414```c415// Временно заблокировать финализацию.416PyInterpreterGuard *guard = PyInterpreterGuard_FromCurrent();417if (guard == NULL) {418 // Финализация уже началась или не хватает памяти.419 return NULL;420}421422Py_BEGIN_ALLOW_THREADS;423// Выполнить критическую обработку здесь. Например, можно безопасно захватить424// блокировки, которые могут быть захвачены потоком финализации.425Py_END_ALLOW_THREADS;426427// Теперь, когда критическая обработка завершена, интерпретатору428// разрешено снова выполнять финализацию.429PyInterpreterGuard_Close(guard);430```431432В случае успеха эта функция возвращает защиту для текущего интерпретатора; в случае неудачи возвращает `NULL` с установленным исключением.433434Эта функция завершится неудачей только в том случае, если текущий интерпретатор уже начал финализацию или если в процессе закончилась память.435436Указатель защиты, возвращаемый этой функцией, должен быть в итоге закрыт с помощью [`PyInterpreterGuard_Close()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PyInterpreterGuard_Close); в противном случае процесс Python будет бесконечно зависать.437438Вызывающая сторона должна удерживать [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state).439440Добавлено в версии 3.15.441442#### `PyInterpreterGuard *PyInterpreterGuard_FromView(PyInterpreterView *view)`443444*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.15.*445446Создаёт защиту финализации для интерпретатора через представление.447448В случае успеха эта функция возвращает защиту для интерпретатора, представленного *view*. Представление остаётся действительным после вызова этой функции. Защита должна быть в итоге закрыта с помощью [`PyInterpreterGuard_Close()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PyInterpreterGuard_Close).449450Если интерпретатор больше не существует, уже завершает финализацию или не хватает памяти, то эта функция возвращает `NULL` без установки исключения.451452Вызывающей стороне не нужно удерживать [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state).453454Добавлено в версии 3.15.455456#### `void PyInterpreterGuard_Close(PyInterpreterGuard *guard)`457458*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.15.*459460Закрывает защиту интерпретатора, позволяя интерпретатору начать финализацию, если не осталось других защит. Если защита интерпретатора никогда не будет закрыта, интерпретатор будет бесконечно ждать при попытке войти в финализацию!461462После закрытия защиты интерпретатора её нельзя использовать в [`PyThreadState_Ensure()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_Ensure). В противном случае поведение будет неопределённым.463464Эта функция не может завершиться неудачей, и вызывающей стороне не нужно удерживать [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state).465466Добавлено в версии 3.15.467468## Представления интерпретатора469470В некоторых случаях может потребоваться доступ к интерпретатору, который мог быть удалён. Это можно сделать с помощью представлений интерпретатора.471472#### `type PyInterpreterView`473474*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) (как непрозрачная структура) начиная с версии 3.15.*475476Непрозрачное представление интерпретатора.477478Это потокобезопасный способ доступа к интерпретатору, который может находиться в процессе финализации или уже уничтожен.479480Добавлено в версии 3.15.481482#### `PyInterpreterView *PyInterpreterView_FromCurrent(void)`483484*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.15.*485486Создаёт представление текущего интерпретатора.487488Эта функция обычно предназначена для использования вместе с [`PyInterpreterGuard_FromView()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PyInterpreterGuard_FromView) или [`PyThreadState_EnsureFromView()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_EnsureFromView).489490В случае успеха функция возвращает представление текущего интерпретатора; в случае неудачи она возвращает `NULL` с установленным исключением.491492Вызывающий код должен удерживать [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state).493494Добавлено в версии 3.15.495496#### `void PyInterpreterView_Close(PyInterpreterView *view)`497498*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.15.*499500Закрывает представление интерпретатора.501502Если представление интерпретатора никогда не закрывается, память представления никогда не освободится, но других последствий нет. (В отличие от этого, забыв закрыть guard, можно бесконечно повесить главный поток при финализации.)503504Эта функция не может завершиться с ошибкой, и вызывающий код не должен удерживать [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state).505506Добавлено в версии 3.15.507508#### `PyInterpreterView *PyInterpreterView_FromMain(void)`509510*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.15.*511512Создаёт представление для главного интерпретатора (первого и используемого по умолчанию интерпретатора в процессе Python; см. [`PyInterpreterState_Main()`](https://python-all.ru/3.16/c-api/subinterpreters.html#c.PyInterpreterState_Main)).513514В случае успеха функция возвращает представление главного интерпретатора; в случае неудачи она возвращает `NULL` без установленного исключения. Неудача означает, что в процессе не хватило памяти.515516Используйте эту функцию, когда вызывающий код не может предоставить указатель на интерпретатор или представление, например, когда нативная библиотека потоков не предоставляет параметр `void *arg`, который мог бы нести [`PyInterpreterGuard`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PyInterpreterGuard) или [`PyInterpreterView`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PyInterpreterView). В коде, поддерживающем подинтерпретаторы, предпочтительнее использовать [`PyInterpreterView_FromCurrent()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PyInterpreterView_FromCurrent), чтобы guard отслеживал вызывающий интерпретатор, а не главный.517518Вызывающий код не должен удерживать [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state).519520Добавлено в версии 3.15.521522## Общепроцессные параметры523524#### `void Py_SetProgramName(const wchar_t *name)`525526*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*527528Этот API сохранён для обратной совместимости: вместо него следует использовать указание [`PyConfig.program_name`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.program_name), см. [Конфигурация инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config).529530Эту функцию следует вызывать до первого вызова [`Py_Initialize()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.Py_Initialize), если она вообще вызывается. Она сообщает интерпретатору значение аргумента `argv[0]` функции `main()` программы (преобразованное в широкие символы). Это используется некоторыми другими функциями ниже для поиска библиотек времени выполнения Python относительно исполняемого файла интерпретатора. Значение по умолчанию – `'python'`. Аргумент должен указывать на строку широких символов, завершающуюся нулём, в статической памяти, содержимое которой не изменится во время выполнения программы. Никакой код в интерпретаторе Python не изменит содержимое этой памяти.531532Используйте [`Py_DecodeLocale()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_DecodeLocale) для декодирования строки байтов, чтобы получить строку wchar\_t\*.533534Устарело с версии 3.11, удалено в версии 3.16.535536#### `const char *Py_GetVersion()`537538*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*539540Возвращает версию данного интерпретатора Python. Это строка, которая выглядит примерно так:541542```c543"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]"544```545546Первое слово (до первого пробела) – это текущая версия Python; первые символы – это мажорная и минорная версии, разделённые точкой. Возвращаемая строка указывает на статическую память; вызывающий код не должен изменять её значение. Это значение доступно в коде Python как [`sys.version`](https://python-all.ru/3.16/library/sys.html#sys.version).547548Смотрите также константу [`Py_Version`](https://python-all.ru/3.16/c-api/apiabiversion.html#c.Py_Version).549550#### `const char *Py_GetPlatform()`551552*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*553554Возвращает идентификатор платформы для текущей платформы. В Unix он формируется из «официального» имени операционной системы, преобразованного в нижний регистр, за которым следует номер основной ревизии; например, для Solaris 2.x, также известного как SunOS 5.x, значение – `'sunos5'`. В macOS – `'darwin'`. В Windows – `'win'`. Возвращаемая строка указывает на статическую память; вызывающий код не должен изменять её значение. Значение доступно в коде Python как `sys.platform`.555556#### `const char *Py_GetCopyright()`557558*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*559560Возвращает официальную строку авторских прав для текущей версии Python, например561562`'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'`563564Возвращаемая строка указывает на статическую память; вызывающий код не должен изменять её значение. Значение доступно в коде Python как `sys.copyright`.565566#### `const char *Py_GetCompiler()`567568*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*569570Возвращает указание компилятора, использованного для сборки текущей версии Python, в квадратных скобках, например:571572```c573"[GCC 2.7.2.2]"574```575576Возвращаемая строка указывает на статическую память; вызывающий код не должен изменять её значение. Значение доступно в коде Python как часть переменной `sys.version`.577578#### `const char *Py_GetBuildInfo()`579580*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*581582Возвращает информацию о порядковом номере и дате и времени сборки текущего экземпляра интерпретатора Python, например583584```c585"#67, Aug 1 1997, 22:34:28"586```587588Возвращаемая строка указывает на статическую память; вызывающий код не должен изменять её значение. Значение доступно коду Python как часть переменной `sys.version`.589590#### `void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)`591592*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*593594Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.argv), [`PyConfig.parse_argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.parse_argv) и [`PyConfig.safe_path`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.safe_path). См. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).595596Устанавливает [`sys.argv`](https://python-all.ru/3.16/library/sys.html#sys.argv) на основе *argc* и *argv*. Эти параметры похожи на передаваемые функции `main()` программы, с тем отличием, что первый элемент должен указывать на исполняемый файл сценария, а не на исполняемый файл, в котором работает интерпретатор Python. Если запускаемый сценарий отсутствует, первый элемент в *argv* может быть пустой строкой. Если этой функции не удаётся инициализировать `sys.argv`, фатальная ситуация сигнализируется с помощью [`Py_FatalError()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_FatalError).597598Если *updatepath* равен нулю, на этом работа функции заканчивается. Если *updatepath* не равен нулю, функция также изменяет [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) по следующему алгоритму:599600- Если в `argv[0]` передано имя существующего сценария, то абсолютный путь к каталогу, в котором находится сценарий, добавляется в начало [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path).601- В противном случае (то есть если *argc* равен `0` или `argv[0]` не указывает на существующее имя файла), пустая строка добавляется в начало [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path), что эквивалентно добавлению текущего рабочего каталога (`"."`).602603Используйте [`Py_DecodeLocale()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_DecodeLocale) для декодирования строки байтов, чтобы получить строку wchar\_t\*.604605См. также члены [`PyConfig.orig_argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.orig_argv) и [`PyConfig.argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.argv) структуры [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).606607> **Примечание**608>609> Приложениям, встраивающим интерпретатор Python не для выполнения одного сценария, рекомендуется передавать `0` в качестве *updatepath* и при желании обновлять [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) самостоятельно. См. [**CVE 2008-5983**](https://python-all.ru/3.16/c-api/interp-lifecycle.html).610>611> В версиях до 3.1.3 того же эффекта можно достичь, вручную удалив первый элемент [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) после вызова [`PySys_SetArgv()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PySys_SetArgv), например используя:612>613> ```c614> PyRun_SimpleString("import sys; sys.path.pop(0)\n");615> ```616617Добавлено в версии 3.1.3.618619Устарело с версии 3.11, удалено в версии 3.16.620621#### `void PySys_SetArgv(int argc, wchar_t **argv)`622623*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*624625Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.argv) и [`PyConfig.parse_argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.parse_argv). См. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).626627Эта функция работает как [`PySys_SetArgvEx()`](https://python-all.ru/3.16/c-api/interp-lifecycle.html#c.PySys_SetArgvEx) с *updatepath*, установленным в `1`, если только интерпретатор **python** не был запущен с [`-I`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-I).628629Используйте [`Py_DecodeLocale()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_DecodeLocale) для декодирования строки байтов, чтобы получить строку wchar\_t\*.630631См. также члены [`PyConfig.orig_argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.orig_argv) и [`PyConfig.argv`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.argv) структуры [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).632633Изменено в версии 3.4: Значение *updatepath* зависит от [`-I`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-I).634635Устарело с версии 3.11, удалено в версии 3.16.636637#### `void Py_SetPythonHome(const wchar_t *home)`638639*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*640641Этот API сохранён для обратной совместимости: вместо него следует использовать [`PyConfig.home`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.home). См. [Python Initialization Configuration](https://python-all.ru/3.16/c-api/init_config.html#init-config).642643Устанавливает домашний каталог по умолчанию, то есть расположение стандартных библиотек Python. См. [`PYTHONHOME`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONHOME) для пояснения значения строки аргумента.644645Аргумент должен указывать на строку символов, завершающуюся нулём, в статической памяти, содержимое которой не будет изменяться в течение всего времени выполнения программы. Никакой код в интерпретаторе Python не будет менять содержимое этой памяти.646647Используйте [`Py_DecodeLocale()`](https://python-all.ru/3.16/c-api/sys.html#c.Py_DecodeLocale) для декодирования строки байтов, чтобы получить строку wchar\_t\*.648649Устарело с версии 3.11, удалено в версии 3.16.650