Конфигурация инициализации Python
Новая в версии 3.8.
Структуры:
Функции:
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
-
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:Кроме того, если используется
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
-
wchar_t* base_executable -
sys._base_executable: значение переменной среды__PYVENV_LAUNCHER__, или копияPyConfig.executable.
-
wchar_t* 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 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: Удаление строк документации
- 0: Оптимизатор peephole (и
-
int parse_argv -
Если значение отлично от нуля, обработать
argvтак же, как обычные аргументы командной строки Python, и удалить аргументы Python изargv: см. Аргументы командной строки.
-
int parser_debug -
Если значение отлично от нуля, включить вывод отладки парсера (только для экспертов, в зависимости от опций компиляции).
-
int pathconfig_warnings -
Если равно 0, подавить предупреждения при вычислении Конфигурации путей (только Unix, Windows не регистрирует предупреждения). В противном случае, предупреждения записываются в
stderr.
-
wchar_t* 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
-
Если 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.homePyConfig.pathconfig_warningsPyConfig.program_namePyConfig.pythonpath_env- текущая рабочая директория: для получения абсолютных путей
-
PATHпеременная окружения для получения полного пути программы (изPyConfig.program_name) -
__PYVENV_LAUNCHER__переменная окружения - (только Windows) Пути приложения в реестре по адресу «SoftwarePythonPythonCoreX.YPythonPath» в HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE (где X.Y — версия Python).
-
Выходные поля конфигурации пути:
Если хотя бы одно «выходное поле» не установлено, 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»:
-
Фаза «основной» инициализации, 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