Spec-Zone.ru › Python 3.8

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

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

Структуры:

  • PyConfig
  • PyPreConfig
  • PyStatus
  • PyWideStringList

Функции:

  • PyConfig_Clear()
  • PyConfig_InitIsolatedConfig()
  • PyConfig_InitPythonConfig()
  • PyConfig_Read()
  • PyConfig_SetArgv()
  • PyConfig_SetBytesArgv()
  • PyConfig_SetBytesString()
  • PyConfig_SetString()
  • PyConfig_SetWideStringList()
  • PyPreConfig_InitIsolatedConfig()
  • PyPreConfig_InitPythonConfig()
  • PyStatus_Error()
  • PyStatus_Exception()
  • PyStatus_Exit()
  • PyStatus_IsError()
  • PyStatus_IsExit()
  • PyStatus_NoMemory()
  • PyStatus_Ok()
  • PyWideStringList_Append()
  • PyWideStringList_Insert()
  • Py_ExitStatusException()
  • Py_InitializeFromConfig()
  • Py_PreInitialize()
  • Py_PreInitializeFromArgs()
  • Py_PreInitializeFromBytesArgs()
  • Py_RunMain()

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

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

См. также

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

PyWideStringList

PyWideStringList

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

Если length не равно нулю, items не должны быть NULL, и все строки должны быть не 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 в конец list.

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

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

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

Py_ssize_t length

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

wchar_t** items

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

PyStatus

PyStatus

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

Для ошибки она может хранить имя 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)

Является ли статус ошибкой или выходом? Если true, исключение должно быть обработано; например, вызывая 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.

Предварительная инициализация с 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);
}

/* at this point, Python will speak UTF-8 */

Py_Initialize();
/* ... use Python API here ... */
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)

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

Предварительно инициализировать 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:

  • dev_mode
  • isolated
  • parse_argv
  • use_environment

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

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

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

PyWideStringList argv

Аргументы командной строки, sys.argv. См. parse_argv для обработки argv таким же образом, как обычный Python обрабатывает аргументы командной строки 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.

END_OF_DOCUMENT_MARKER
int isolated

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

  • sys.path не содержит ни директории скрипта (вычисленной из argv[0] или текущей директории), ни директории пользовательских пакетов.
  • Python REPL не импортирует 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: Удаление строк документации
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

Если значение отлично от нуля, добавить директорию пользовательских пакетов в 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.

Инициализация с 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);

    /* Set the program name. Implicitly preinitialize 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);

    /* Set the program name before reading the configuration
       (decode byte string from the locale encoding).

       Implicitly preinitialize Python. */
    status = PyConfig_SetBytesString(&config, &config.program_name,
                                  program_name);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Read all configuration at once */
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Append our custom search path to sys.path */
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/more/modules");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Override executable computed by PyConfig_Read() */
    status = PyConfig_SetString(&config, &config.executable,
                                L"/path/to/my_executable");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    status = Py_InitializeFromConfig(&config);

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

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

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

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

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

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

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;

    /* Decode command line arguments.
       Implicitly preinitialize Python (in isolated mode). */
    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;
    }
    /* Display the error message and exit the process with
       non-zero exit code */
    Py_ExitStatusException(status);
}

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

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

  • Входы для конфигурации пути:

    • PyConfig.home
    • PyConfig.pathconfig_warnings
    • PyConfig.program_name
    • PyConfig.pythonpath_env
    • текущая рабочая директория: для получения абсолютных путей
    • PATH переменная окружения для получения полного пути программы (из PyConfig.program_name)
    • __PYVENV_LAUNCHER__ переменная окружения
    • (только Windows) Пути приложения в реестре по адресу «SoftwarePythonPythonCoreX.YPythonPath» в HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE (где X.Y — версия Python).
  • Выходные поля конфигурации пути:

    • PyConfig.base_exec_prefix
    • PyConfig.base_executable
    • PyConfig.base_prefix
    • PyConfig.exec_prefix
    • PyConfig.executable
    • PyConfig.module_search_paths_set, PyConfig.module_search_paths
    • PyConfig.prefix

Если хотя бы одно «выходное поле» не установлено, 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 для примера настраиваемого Python, всегда работающего в изолированном режиме, используя Py_RunMain().

Многофазная инициализация. Приватный предварительный 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() останавливается на фазе инициализации «ядра».
PyStatus _Py_InitializeMain(void)

Перейти к фазе «основной» инициализации, завершить инициализацию Python.

Ни один модуль не импортируется во время фазы «ядра», и модуль importlib не настроен: Конфигурация путей применяется только во время фазы «основной». Это может позволить настраивать Python в Python для переопределения или настройки Конфигурации путей, возможно, установить пользовательский импортер sys.meta_path или обработчик импорта и т.д.

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

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

Пример запуска Python-кода между фазами инициализации «ядра» и «основной»:

void init_python(void)
{
    PyStatus status;

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

    /* ... customize 'config' configuration ... */

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

    /* Use sys.stderr because sys.stdout is only created
       by _Py_InitializeMain() */
    int res = PyRun_SimpleString(
        "import sys; "
        "print('Run Python code before _Py_InitializeMain', "
               "file=sys.stderr)");
    if (res < 0) {
        exit(1);
    }

    /* ... put more configuration code here ... */

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

© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/c-api/init_config.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API