Содержание страницы
Конфигурация инициализации Python¶Python 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¶
-
PyStatus¶ Структура для хранения состояния функции инициализации: успех, ошибка\nили завершение.
В случае ошибки может хранить имя C-функции, вызвавшей ошибку.
Поля структуры:
-
int
exitcode¶ Код выхода. Аргумент, передаваемый в
exit().
-
const char *
err_msg¶ Сообщение об ошибке.
-
const char *
func¶ Имя функции, создавшей ошибку, может быть
NULL.
Функции создания статуса:
Функции обработки статуса:
-
int
PyStatus_Exception(PyStatus status)¶ Является ли статус ошибкой или выходом? Если да, исключение должно быть обработано, например, вызовом
Py_ExitStatusException().
-
int
Примечание
Внутренне 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 pymallocPYMEM_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¶Preinitialization 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.
Большинство методов
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¶
-
wchar_t*
base_executable¶ sys._base_executable: значение переменной окружения__PYVENV_LAUNCHER__или копияPyConfig.executable.
-
wchar_t*
base_prefix¶
-
wchar_t*
platlibdir¶ sys.platlibdir: имя каталога библиотеки платформы, устанавливаемое во время конфигурирования с помощью--with-platlibdir, может быть переопределено переменной окруженияPYTHONPLATLIBDIR.Новое в версии 3.9.
-
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¶ Если не равно нулю, включается режим разработки Python.
-
int
dump_refs¶ Если не равно нулю, сбрасывать все объекты, которые все еще существуют при завершении.
Макрос
Py_TRACE_REFSдолжен быть определен при сборке.
-
wchar_t*
exec_prefix¶
-
wchar_t*
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__вFalse2: Удалить docstrings
-
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_ref_count¶ Показывать общее количество ссылок при завершении?
Устанавливается в 1 опцией командной строки
-X showrefcount.Требуется отладочная сборка Python (макрос
Py_REF_DEBUGдолжен быть определён).
-
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
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¶
-
int
_use_peg_parser¶ Включить PEG-парсер? По умолчанию: 1.
Устанавливается в 0 вызовом
-X oldparserиPYTHONOLDPARSER.См. также PEP 617.
Устарело с версии 3.9, будет удалено в версии 3.10.
-
void
Если parse_argv не ноль, то аргументы argv разбираются так же,
как обычный Python разбирает аргументы командной строки, и аргументы Python
удаляются из argv: см. Аргументы командной строки.
Параметры xoptions разбираются для установки других параметров: см. параметр -X.
Изменено в версии 3.9: Поле show_alloc_count было удалено.
Инициализация с PyConfig¶Initialization with PyConfig
Функция для инициализации Python:
-
PyStatus
Py_InitializeFromConfig(const PyConfig *config)¶ Инициализирует Python из конфигурации config.
Вызывающий код отвечает за обработку исключений (ошибка или выход) с помощью PyStatus_Exception() и Py_ExitStatusException().
Если используются PyImport_FrozenModules(), PyImport_AppendInittab() или PyImport_ExtendInittab(), они должны быть установлены или вызваны после предварительной инициализации Python и до инициализации Python. Если Python инициализируется несколько раз, PyImport_AppendInittab() или PyImport_ExtendInittab() должны вызываться перед каждой инициализацией 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 («выходные поля») в значение, игнорирующее эти конфигурационные файлы, чтобы функция не вычисляла конфигурацию путей по умолчанию.
Конфигурация Python¶Python 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 содержит несколько полей для конфигурации путей:
Входные данные конфигурации путей:
текущий рабочий каталог: для получения абсолютных путей
переменная окружения
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.cfgpython._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().
Py_GetArgcArgv()¶
-
void
Py_GetArgcArgv(int *argc, wchar_t ***argv)¶ Возвращает исходные аргументы командной строки до того, как Python их изменил.
Многофазная инициализация (частный временный API)¶Multi-Phase Initialization Private Provisional API
Данный раздел представляет собой частный временный API, вводящий многофазную инициализацию – ключевую возможность PEP 432:
Фаза «базовой» инициализации, «минимальный Python»:
Фаза «основной» инициализации, Python полностью инициализирован:
Устанавливает и настраивает
importlib;Применяет конфигурацию путей;
Устанавливает обработчики сигналов;
Завершает инициализацию модуля
sys(например, создаётsys.stdoutиsys.path);Включает опциональные возможности, такие как
faulthandlerиtracemalloc;Импортировать модуль
site;и т. д.
Частный временный API:
PyConfig._init_main: если установлено в 0,Py_InitializeFromConfig()останавливается на фазе инициализации «Core».PyConfig._isolated_interpreter: если не равно нулю, запретить потоки, подпроцессы и fork.
-
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);
}
}