Документация Python неофициальный перевод
Содержание страницы

Конфигурация инициализации PythonPython Initialization Configuration

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

Структуры:

Функции:

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

См. также Инициализация, финализация и потоки.

См. также

PEP 587 “Конфигурация инициализации Python”.

PyWideStringList

PyWideStringList

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

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

Методы:

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

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

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

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

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

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

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

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

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

Py_ssize_t length

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

wchar_t** items

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

PyStatus

PyStatus

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

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

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

int exitcode

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

const char *err_msg

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

const char *func

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

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

PyStatus PyStatus_Ok(void)

Успех.

PyStatus PyStatus_Error(const char *err_msg)

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

PyStatus PyStatus_NoMemory(void)

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

PyStatus PyStatus_Exit(int exitcode)

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

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

int PyStatus_Exception(PyStatus status)

Является ли статус ошибкой или выходом? Если да, исключение должно быть обработано, например, вызовом Py_ExitStatusException().

int PyStatus_IsError(PyStatus status)

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

int PyStatus_IsExit(PyStatus status)

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

void Py_ExitStatusException(PyStatus status)

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

Примечание

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

Пример:

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

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

PyPreConfig

PyPreConfig

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

  • Установка распределителя памяти Python

  • Настройка локали LC_CTYPE

  • Установка режима UTF-8

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

void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)

Инициализировать предварительную конфигурацию с Конфигурацией Python.

void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)

Инициализировать предварительную конфигурацию с Изолированной конфигурацией.

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

int allocator

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

  • PYMEM_ALLOCATOR_NOT_SET (0): не менять распределители памяти (использовать по умолчанию)

  • PYMEM_ALLOCATOR_DEFAULT (1): распределители памяти по умолчанию

  • PYMEM_ALLOCATOR_DEBUG (2): распределители памяти по умолчанию с отладочными хуками

  • PYMEM_ALLOCATOR_MALLOC (3): принудительно использовать malloc()

  • PYMEM_ALLOCATOR_MALLOC_DEBUG (4): принудительно использовать malloc() с отладочными хуками

  • PYMEM_ALLOCATOR_PYMALLOC (5): аллокатор памяти Python pymalloc

  • PYMEM_ALLOCATOR_PYMALLOC_DEBUG (6): Python pymalloc аллокатор памяти с отладочными хуками

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

См. Управление памятью.

int configure_locale

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

int coerce_c_locale

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

int coerce_c_locale_warn

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

int dev_mode

См. PyConfig.dev_mode.

int isolated

См. PyConfig.isolated.

int legacy_windows_fs_encoding(Windows only)

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

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

int parse_argv

Если не равно нулю, Py_PreInitializeFromArgs() и Py_PreInitializeFromBytesArgs() обрабатывают свой аргумент argv так же, как обычный Python обрабатывает аргументы командной строки: см. Аргументы командной строки.

int use_environment

См. PyConfig.use_environment.

int utf8_mode

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

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

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

PyStatus Py_PreInitialize(const PyPreConfig *preconfig)

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

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

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

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

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

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

Для конфигурации Python (PyPreConfig_InitPythonConfig()), если Python инициализируется с аргументами командной строки, эти аргументы также должны быть переданы для предварительной инициализации Python, поскольку они влияют на предварительную конфигурацию, например, на кодировки. Например, опция командной строки -X utf8 включает режим UTF-8.

PyMem_SetAllocator() можно вызывать после Py_PreInitialize() и до Py_InitializeFromConfig(), чтобы установить собственный распределитель памяти. Его можно вызывать до Py_PreInitialize(), если PyPreConfig.allocator установлен в PYMEM_ALLOCATOR_NOT_SET.

Функции распределения памяти Python, такие как PyMem_RawMalloc(), не должны использоваться до предварительной инициализации Python, в то время как прямой вызов malloc() и free() всегда безопасен. Py_DecodeLocale() не должна вызываться до предварительной инициализации.

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

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

preconfig.utf8_mode = 1;

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

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

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

PyConfig

PyConfig

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

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

void PyConfig_InitPythonConfig(PyConfig *config)

Инициализирует конфигурацию с помощью Конфигурации Python.

void PyConfig_InitIsolatedConfig(PyConfig *config)

Инициализирует конфигурацию с помощью Изолированной конфигурации.

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

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

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

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

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

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

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

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

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

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

Устанавливает аргументы командной строки: декодирует байты с помощью Py_DecodeLocale().

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

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

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

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

PyStatus PyConfig_Read(PyConfig *config)

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

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

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

void PyConfig_Clear(PyConfig *config)

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

Большинство методов PyConfig при необходимости предварительно инициализируют Python. В этом случае конфигурация предварительной инициализации Python основывается на PyConfig. Если настраиваются поля конфигурации, общие с PyPreConfig, они должны быть установлены до вызова метода PyConfig:

Более того, если используется PyConfig_SetArgv() или PyConfig_SetBytesArgv(), этот метод должен быть вызван первым, до других методов, поскольку конфигурация предварительной инициализации зависит от аргументов командной строки (если parse_argv не равно нулю).

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

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

PyWideStringList argv

Аргументы командной строки, sys.argv. См. parse_argv для разбора argv так же, как обычный Python разбирает аргументы командной строки. Если argv пуст, добавляется пустая строка, чтобы гарантировать, что sys.argv всегда существует и никогда не пуст.

wchar_t* base_exec_prefix

sys.base_exec_prefix.

wchar_t* base_executable

sys._base_executable: значение переменной окружения __PYVENV_LAUNCHER__ или копия PyConfig.executable.

wchar_t* base_prefix

sys.base_prefix.

int buffered_stdio

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

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

int bytes_warning

Если равно 1, выдает предупреждение при сравнении bytes или bytearray с str, или при сравнении bytes с int. Если равно 2 или больше, возбуждает исключение BytesWarning.

wchar_t* check_hash_pycs_mode

Управляет поведением проверки хешированных файлов .pyc (см. PEP 552): значение параметра командной строки --check-hash-based-pycs.

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

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

int configure_c_stdio

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

int dev_mode

Режим разработки: см. -X dev.

int dump_refs

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

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

wchar_t* exec_prefix

sys.exec_prefix.

wchar_t* executable

sys.executable.

int faulthandler

Если не равно нулю, вызывается faulthandler.enable() при запуске.

wchar_t* filesystem_encoding

Кодировка файловой системы, sys.getfilesystemencoding().

wchar_t* filesystem_errors

Ошибки кодировки файловой системы, sys.getfilesystemencodeerrors().

unsigned long hash_seed
int use_hash_seed

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

Если use_hash_seed равно нулю, начальное значение выбирается случайным образом при запуске Python, а hash_seed игнорируется.

wchar_t* home

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

По умолчанию инициализируется из значения переменной окружения PYTHONHOME.

int import_time

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

int inspect

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

int install_signal_handlers

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

int interactive

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

int isolated

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

  • sys.path не содержит ни каталог скрипта (вычисленный из argv[0] или текущего каталога), ни каталог site-packages пользователя.

  • REPL Python не импортирует readline и не включает стандартную конфигурацию readline в интерактивных приглашениях.

  • Установить use_environment и user_site_directory в 0.

int legacy_windows_stdio

Если не ноль, использовать io.FileIO вместо io.WindowsConsoleIO для sys.stdin, sys.stdout и sys.stderr.

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

int malloc_stats

Если не ноль, вывести статистику по аллокатору памяти Python pymalloc при завершении.

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

wchar_t* pythonpath_env

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

По умолчанию инициализируется из значения переменной окружения PYTHONPATH.

PyWideStringList module_search_paths
int module_search_paths_set

sys.path. Если module_search_paths_set равно 0, module_search_paths переопределяется функцией, вычисляющей конфигурацию путей.

int optimization_level

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

  • 0: Оптимизатор peephole (а __debug__ установлен в True)

  • 1: Удалить утверждения, установить __debug__ в False

  • 2: Удалить docstrings

int parse_argv

Если не ноль, разбирать argv так же, как обычные аргументы командной строки Python, и удалять аргументы Python из argv: см. Аргументы командной строки.

int parser_debug

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

int pathconfig_warnings

Если равно 0, подавлять предупреждения при вычислении конфигурации путей (только Unix, Windows не записывает никаких предупреждений). В противном случае предупреждения записываются в stderr.

wchar_t* prefix

sys.prefix.

wchar_t* program_name

Имя программы. Используется для инициализации executable и в ранних сообщениях об ошибках.

wchar_t* pycache_prefix

sys.pycache_prefix: префикс кэша .pyc.

Если NULL, sys.pycache_prefix устанавливается в None.

int quiet

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

wchar_t* run_command

Аргумент python3 -c COMMAND. Используется Py_RunMain().

wchar_t* run_filename

Аргумент python3 FILENAME. Используется Py_RunMain().

wchar_t* run_module

Аргумент python3 -m MODULE. Используется Py_RunMain().

int show_alloc_count

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

Устанавливается в 1 опцией командной строки -X showalloccount.

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

int show_ref_count

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

Устанавливается в 1 опцией командной строки -X showrefcount.

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

int site_import

Импортировать модуль site при запуске?

int skip_source_first_line

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

wchar_t* stdio_encoding
wchar_t* stdio_errors

Кодировка и ошибки кодировки для sys.stdin, sys.stdout и sys.stderr.

int tracemalloc

Если не равно нулю, вызывается tracemalloc.start() при запуске.

int use_environment

Если больше 0, использовать переменные окружения.

int user_site_directory

Если не ноль, добавить каталог пользовательского site в sys.path.

int verbose

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

PyWideStringList warnoptions

sys.warnoptions: параметры модуля warnings для построения фильтров предупреждений: от низшего к высшему приоритету.

Модуль warnings добавляет sys.warnoptions в обратном порядке: последний элемент PyConfig.warnoptions становится первым элементом warnings.filters, который проверяется первым (наивысший приоритет).

int write_bytecode

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

sys.dont_write_bytecode инициализируется инвертированным значением write_bytecode.

PyWideStringList xoptions

sys._xoptions.

Если parse_argv не ноль, то аргументы argv разбираются так же, как обычный Python разбирает аргументы командной строки, и аргументы Python удаляются из argv: см. Аргументы командной строки.

Параметры xoptions разбираются для установки других параметров: см. параметр -X.

Инициализация с PyConfigInitialization with PyConfig

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

PyStatus Py_InitializeFromConfig(const PyConfig *config)

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

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

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

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

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Установить имя программы. Неявно предварительно инициализировать Python. */
    status = PyConfig_SetString(&config, &config.program_name,
                                L"/path/to/my_program");
    if (PyStatus_Exception(status)) {
        goto fail;
    }

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

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

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

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

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

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

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

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

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

    /* Переопределить исполняемый файл, вычисленный PyConfig_Read() */
    status = PyConfig_SetString(&config, &config.executable,
                                L"/path/to/my_executable");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    status = Py_InitializeFromConfig(&config);

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

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

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

Эта конфигурация игнорирует глобальные переменные конфигурации, переменные окружения, аргументы командной строки (PyConfig.argv не разбирается) и пользовательский каталог сайтов. Стандартные потоки C (например, stdout) и локаль LC_CTYPE остаются без изменений. Обработчики сигналов не устанавливаются.

Конфигурационные файлы всё ещё используются с этой конфигурацией. Установите Path Configuration («выходные поля») в значение, игнорирующее эти конфигурационные файлы, чтобы функция не вычисляла конфигурацию путей по умолчанию.

Конфигурация PythonPython Configuration

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

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

Эта функция включает принудительное использование локали C (PEP 538) и режим UTF-8 (PEP 540) в зависимости от локали LC_CTYPE, переменных окружения PYTHONUTF8 и PYTHONCOERCECLOCALE.

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

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

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

    /* Декодировать аргументы командной строки.
       Неявно предварительно инициализировать Python (в изолированном режиме). */
    status = PyConfig_SetBytesArgv(&config, argc, argv);
    if (PyStatus_Exception(status)) {
        goto fail;
    }

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

    return Py_RunMain();

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

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

PyConfig содержит несколько полей для конфигурации путей:

Если хотя бы одно «выходное поле» не установлено, Python вычисляет конфигурацию пути, чтобы заполнить неустановленные поля. Если module_search_paths_set равно 0, module_search_paths переопределяется и module_search_paths_set устанавливается в 1.

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

Установите pathconfig_warnings в 0, чтобы подавить предупреждения при вычислении конфигурации пути (только Unix; Windows не выводит предупреждения).

Если поля base_prefix или base_exec_prefix не заданы, они наследуют свои значения от prefix и exec_prefix соответственно.

Py_RunMain() и Py_Main() изменяют sys.path:

  • Если run_filename задано и является каталогом, содержащим скрипт __main__.py, добавьте run_filename в начало sys.path.

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

    • Если run_module задан, добавьте текущий каталог в начало sys.path. Ничего не делайте, если текущий каталог не может быть прочитан.

    • Если run_filename задан, добавьте каталог файла в начало sys.path.

    • В противном случае пустая строка добавляется в начало sys.path.

Если site_import не равно нулю, то sys.path может быть изменён модулем site. Если user_site_directory не равно нулю и каталог пакетов сайта пользователя существует, модуль site добавляет каталог пакетов сайта пользователя в sys.path.

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

  • pyvenv.cfg

  • python._pth (только Windows)

  • pybuilddir.txt (только Unix)

Переменная окружения __PYVENV_LAUNCHER__ используется для установки PyConfig.base_executable.

Py_RunMain()

int Py_RunMain(void)

Выполняет команду (PyConfig.run_command), скрипт (PyConfig.run_filename) или модуль (PyConfig.run_module), указанные в командной строке или в конфигурации.

По умолчанию, а также при использовании опции -i, запускается REPL.

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

См. Python Configuration для примера настройки Python для постоянной работы в изолированном режиме с помощью Py_RunMain().

Многофазная инициализация (частный временный API)Multi-Phase Initialization Private Provisional API

Этот раздел представляет собой частный временный API, вводящий многофазную инициализацию, ключевую возможность PEP 432:

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

    • Встроенные типы;

    • Встроенные исключения;

    • Встроенные и замороженные модули;

    • Модуль sys инициализирован лишь частично (например, sys.path ещё не существует).

  • Фаза «основной» инициализации, Python полностью инициализирован:

    • Устанавливает и настраивает importlib;

    • Применяет конфигурацию путей;

    • Устанавливает обработчики сигналов;

    • Завершает инициализацию модуля sys (например, создаёт sys.stdout и sys.path);

    • Включает опциональные возможности, такие как faulthandler и tracemalloc;

    • Импортировать модуль site;

    • и т. д.

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

  • PyConfig._init_main: если установлено в 0, Py_InitializeFromConfig() останавливается на фазе инициализации «Core».

PyStatus _Py_InitializeMain(void)

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

Во время фазы «Core» не импортируется ни один модуль, а модуль importlib не настроен: Path Configuration применяется только во время фазы «Main». Это может позволить настраивать Python из Python, чтобы переопределить или настроить Path Configuration, возможно, установить пользовательский импортёр sys.meta_path или хук импорта и т. д.

Возможно, станет возможным вычислять конфигурацию путей в Python после этапа Core и до этапа Main, что является одной из мотиваций PEP 432.

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

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

void init_python(void)
{
    PyStatus status;

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

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

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

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

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

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