Конфигурация инициализации Python
Добавлено в версии 3.8.
Python можно инициализировать с помощью Py_InitializeFromConfig() и структуры PyConfig. Предварительную инициализацию можно выполнить с помощью Py_PreInitialize() и структуры PyPreConfig.
Существует два вида конфигурации:
- Конфигурацию Python можно использовать для создания модифицированной сборки Python, которая ведёт себя как обычный Python. Например, для настройки Python используются переменные окружения и аргументы командной строки.
- Изолированную конфигурацию можно использовать для встраивания Python в приложение. Она изолирует Python от системы. Например, переменные окружения игнорируются, локаль LC_CTYPE не изменяется и обработчики сигналов не регистрируются.
Функцию Py_RunMain() можно использовать для написания модифицированной программы на Python.
См. также раздел Инициализация, завершение работы и потоки.
См. также
PEP 587 «Конфигурация инициализации Python».
Пример
Пример модифицированной программы на 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 exception;
}
status = Py_InitializeFromConfig(&config);
if (PyStatus_Exception(status)) {
goto exception;
}
PyConfig_Clear(&config);
return Py_RunMain();
exception:
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);
}
PyWideStringList
-
type 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
-
type PyStatus -
Структура для хранения состояния функции инициализации: успех, ошибка или завершение работы.
В случае ошибки в ней может храниться имя функции C, вызвавшей ошибку.
Поля структуры:
-
int exitcode -
Код завершения. Аргумент, передаваемый в
exit().
-
const char *err_msg -
Сообщение об ошибке.
-
const char *func -
Имя функции, вызвавшей ошибку; может быть
NULL.
Функции для создания состояния:
-
PyStatus PyStatus_Ok(void) -
Успех.
-
PyStatus PyStatus_Error(const char *err_msg) -
Ошибка инициализации с сообщением.
err_msg не должен быть
NULL.
-
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
-
type PyPreConfig -
Структура, используемая для предварительной инициализации Python.
Функции для инициализации предварительной конфигурации:
-
void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig) -
Инициализирует предварительную конфигурацию с параметрами конфигурации Python.
-
void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig) -
Инициализирует предварительную конфигурацию с параметрами изолированной конфигурации.
Поля структуры:
-
int allocator -
Название аллокатора памяти Python:
-
PYMEM_ALLOCATOR_NOT_SET(0): не изменять аллокаторы памяти (использовать значения по умолчанию). -
PYMEM_ALLOCATOR_DEFAULT(1): аллокаторы памяти по умолчанию. -
PYMEM_ALLOCATOR_DEBUG(2): аллокаторы памяти по умолчанию с отладочными перехватчиками. -
PYMEM_ALLOCATOR_MALLOC(3): использоватьmalloc()библиотеки C. -
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 собран с параметромconfigured using --without-pymalloc.См. раздел Управление памятью.
По умолчанию:
PYMEM_ALLOCATOR_NOT_SET. -
-
int configure_locale -
Устанавливает для локали LC_CTYPE локаль, предпочитаемую пользователем.
Если значение равно
0, устанавливает для членовcoerce_c_localeиcoerce_c_locale_warnзначение0.См. термин кодировка локали.
По умолчанию:
1в конфигурации Python,0в изолированной конфигурации.
-
int coerce_c_locale -
Если значение равно
2, принудительно устанавливает локаль C.Если значение равно
1, считывает локаль LC_CTYPE, чтобы определить, следует ли её принудительно установить.См. термин кодировка локали.
По умолчанию:
-1в конфигурации Python,0в изолированной конфигурации.
-
int coerce_c_locale_warn -
Если значение отлично от нуля, выдаёт предупреждение, если локаль C была принудительно установлена.
По умолчанию:
-1в конфигурации Python,0в изолированной конфигурации.
-
int dev_mode -
Режим разработки Python: см.
PyConfig.dev_mode.По умолчанию:
-1в режиме Python,0в изолированном режиме.
-
int isolated -
Изолированный режим: см.
PyConfig.isolated.По умолчанию:
0в режиме Python,1в изолированном режиме.
-
int legacy_windows_fs_encoding -
Если значение отлично от нуля:
- Устанавливает для
PyPreConfig.utf8_modeзначение0, - Устанавливает для
PyConfig.filesystem_encodingзначение"mbcs", - Устанавливает для
PyConfig.filesystem_errorsзначение"replace".
Инициализируется значением переменной окружения
PYTHONLEGACYWINDOWSFSENCODING.Доступно только в Windows. Макрос
#ifdef MS_WINDOWSможно использовать в коде, специфичном для Windows.По умолчанию:
0. - Устанавливает для
-
int parse_argv -
Если значение отлично от нуля, функции
Py_PreInitializeFromArgs()иPy_PreInitializeFromBytesArgs()разбирают аргументargvтак же, как обычный Python разбирает аргументы командной строки: см. раздел Аргументы командной строки.По умолчанию:
1в конфигурации Python,0в изолированной конфигурации.
-
int use_environment -
Использовать ли переменные окружения? См.
PyConfig.use_environment.По умолчанию:
1в конфигурации Python и0в изолированной конфигурации.
-
int utf8_mode -
Если значение отлично от нуля, включает режим UTF-8 Python.
Устанавливается в значение
0или1параметром командной строки-X utf8и переменной окруженияPYTHONUTF8.Также устанавливается в значение
1, если локальLC_CTYPEимеет значениеCилиPOSIX.По умолчанию:
-1в конфигурации Python и0в изолированной конфигурации.
-
Предварительная инициализация Python с помощью PyPreConfig
Предварительная инициализация Python выполняет следующие действия:
- Устанавливает аллокаторы памяти Python (
PyPreConfig.allocator) - Настраивает локаль LC_CTYPE (кодировка локали)
- Устанавливает режим UTF-8 Python (
PyPreConfig.utf8_mode)
Текущая предварительная конфигурация (тип PyPreConfig) хранится в _PyRuntime.preconfig.
Функции для предварительной инициализации Python:
-
PyStatus Py_PreInitialize(const PyPreConfig *preconfig) -
Выполняет предварительную инициализацию Python с предварительной конфигурацией preconfig.
preconfig не должен быть
NULL.
-
PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char *const *argv) -
Выполняет предварительную инициализацию Python с предварительной конфигурацией preconfig.
Разбирает аргументы командной строки argv (байтовые строки), если значение
parse_argvв preconfig отлично от нуля.preconfig не должен быть
NULL.
-
PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t *const *argv) -
Выполняет предварительную инициализацию Python с предварительной конфигурацией preconfig.
Разбирает аргументы командной строки argv (широкие строки), если значение
parse_argvв preconfig отлично от нуля.preconfig не должен быть
NULL.
Вызывающий код отвечает за обработку исключений (ошибки или завершения работы) с помощью PyStatus_Exception() и Py_ExitStatusException().
При использовании конфигурации Python (PyPreConfig_InitPythonConfig()), если Python инициализируется с аргументами командной строки, их также необходимо передать для предварительной инициализации Python, поскольку они влияют на предварительную конфигурацию, например на кодировки. Например, параметр командной строки -X utf8 включает режим UTF-8 Python.
PyMem_SetAllocator() можно вызвать после Py_PreInitialize() и до Py_InitializeFromConfig(), чтобы установить пользовательский аллокатор памяти. Её можно вызвать до Py_PreInitialize(), если для PyPreConfig.allocator установлено значение PYMEM_ALLOCATOR_NOT_SET.
Функции выделения памяти Python, такие как PyMem_RawMalloc(), нельзя использовать до предварительной инициализации Python. При этом прямой вызов malloc() и free() всегда безопасен. Функцию Py_DecodeLocale() нельзя вызывать до предварительной инициализации Python.
Пример предварительной инициализации для включения режима UTF-8 Python:
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 speaks UTF-8 */
Py_Initialize();
/* ... use Python API here ... */
Py_Finalize();
PyConfig
-
type PyConfig -
Структура, содержащая большинство параметров для настройки Python.
После завершения необходимо использовать функцию
PyConfig_Clear(), чтобы освободить память конфигурации.Методы структуры:
-
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) -
Задать аргументы командной строки (член
argvструктуры config) из списка argv, состоящего из строк широких символов.При необходимости предварительно инициализировать Python.
-
PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char *const *argv) -
Задать аргументы командной строки (член
argvструктуры config) из списка 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 3.11 при вызове этой функции поля, относящиеся к конфигурации путей, больше не вычисляются и не изменяются.
Функция
PyConfig_Read()анализирует аргументыPyConfig.argvтолько один раз: после разбора аргументовPyConfig.parse_argvполучает значение2. Поскольку аргументы Python удаляются изPyConfig.argv, повторный разбор аргументов привёл бы к тому, что параметры приложения разбирались бы как параметры Python.При необходимости предварительно инициализировать Python.
Изменено в версии 3.10: Аргументы
PyConfig.argvтеперь разбираются только один раз, после разбора аргументовPyConfig.parse_argvполучает значение2, а аргументы разбираются только в том случае, еслиPyConfig.parse_argvравно1.Изменено в версии 3.11:
PyConfig_Read()больше не вычисляет все пути, поэтому поля, перечисленные в разделе конфигурации путей Python, могут оставаться без изменений до вызоваPy_InitializeFromConfig().
-
void PyConfig_Clear(PyConfig *config) -
Освободить память конфигурации.
Большинство методов
PyConfigпри необходимости предварительно инициализируют Python. В этом случае конфигурация предварительной инициализации Python (PyPreConfig) основывается наPyConfig. Если изменяются поля конфигурации, общие дляPyPreConfig, их необходимо задать до вызова методаPyConfig:Кроме того, если используется
PyConfig_SetArgv()илиPyConfig_SetBytesArgv(), этот метод необходимо вызвать до других методов, поскольку конфигурация предварительной инициализации зависит от аргументов командной строки (еслиparse_argvне равен нулю).Вызывающая сторона этих методов отвечает за обработку исключений (ошибок или выхода) с помощью
PyStatus_Exception()иPy_ExitStatusException().Поля структуры:
-
PyWideStringList argv -
Аргументы командной строки:
sys.argv.Задайте для
parse_argvзначение1, чтобы разобратьargvтак же, как обычная среда Python разбирает аргументы командной строки Python, а затем удалить аргументы Python изargv.Если
argvпуст, добавляется пустая строка, чтобы гарантировать, чтоsys.argvвсегда существует и не бывает пустым.По умолчанию:
NULL.См. также член
orig_argv.
-
int safe_path -
Если равно нулю,
Py_RunMain()при запуске добавляет в началоsys.pathпотенциально небезопасный путь:- Если
argv[0]равноL"-m"(python -m module), добавляется текущий рабочий каталог. - При запуске скрипта (
python script.py) добавляется каталог скрипта. Если скрипт является символической ссылкой, символические ссылки разрешаются. - В противном случае (
python -c codeиpython) добавляется пустая строка, обозначающая текущий рабочий каталог.
Получает значение
1при использовании параметра командной строки-Pи переменной средыPYTHONSAFEPATH.По умолчанию:
0в конфигурации Python,1в изолированной конфигурации.Добавлено в версии 3.11.
- Если
-
wchar_t *base_exec_prefix -
По умолчанию:
NULL.Часть результата конфигурации путей Python.
-
wchar_t *base_executable -
Базовый исполняемый файл Python:
sys._base_executable.Задаётся переменной среды
__PYVENV_LAUNCHER__.Задаётся из
PyConfig.executable, еслиNULL.По умолчанию:
NULL.Часть результата конфигурации путей Python.
-
wchar_t *base_prefix -
По умолчанию:
NULL.Часть результата конфигурации путей Python.
-
int buffered_stdio -
Если равно
0иconfigure_c_stdioне равно нулю, отключает буферизацию потоков C stdout и stderr.Получает значение
0при использовании параметра командной строки-uи переменной средыPYTHONUNBUFFERED.Поток stdin всегда открывается в буферизованном режиме.
По умолчанию:
1.
-
int bytes_warning -
Если равно
1, выдаёт предупреждение при сравненииbytesилиbytearrayсstr, а также при сравненииbytesсint.Если значение равно или больше
2, в этих случаях возбуждается исключениеBytesWarning.Увеличивается на единицу при использовании параметра командной строки
-b.По умолчанию:
0.
-
int warn_default_encoding -
Если значение не равно нулю, выдаёт предупреждение
EncodingWarning, когдаio.TextIOWrapperиспользует кодировку по умолчанию. Подробнее см. раздел Предупреждение EncodingWarning по запросу.По умолчанию:
0.Добавлено в версии 3.10.
-
int code_debug_ranges -
Если равно
0, отключает включение соответствий конечных строк и столбцов в объекты кода. Также отключает вывод указателей на конкретные места ошибок в трассировках.Получает значение
0при использовании переменной средыPYTHONNODEBUGRANGESи параметра командной строки-X no_debug_ranges.По умолчанию:
1.Добавлено в версии 3.11.
-
wchar_t *check_hash_pycs_mode -
Управляет проверкой файлов
.pycна основе хеша: значение параметра командной строки--check-hash-based-pycs.Допустимые значения:
-
L"always": вычислять хеш исходного файла для определения необходимости инвалидации независимо от значения флага «check_source». -
L"never": считать файлы pyc на основе хеша всегда действительными. -
L"default": флаг «check_source» в файлах pyc на основе хеша определяет необходимость инвалидации.
По умолчанию:
L"default".См. также PEP 552 «Детерминированные файлы pyc».
-
-
int configure_c_stdio -
Если значение не равно нулю, настраивает стандартные потоки C:
- В Windows задаёт двоичный режим (
O_BINARY) для stdin, stdout и stderr. - Если
buffered_stdioравно нулю, отключает буферизацию потоков stdin, stdout и stderr. - Если
interactiveне равно нулю, включает буферизацию потоков stdin и stdout (только stdout в Windows).
По умолчанию:
1в конфигурации Python,0в изолированной конфигурации. - В Windows задаёт двоичный режим (
-
int dev_mode -
Если значение не равно нулю, включает режим разработки Python.
Получает значение
1при использовании параметра-X devи переменной средыPYTHONDEVMODE.По умолчанию:
-1в режиме Python,0в изолированном режиме.
-
int dump_refs -
Выводить ссылки Python?
Если значение не равно нулю, при выходе выводятся все ещё существующие объекты.
Получает значение
1при использовании переменной средыPYTHONDUMPREFS.Требуется специальная сборка Python с определённым макросом
Py_TRACE_REFS: см.configure --with-trace-refs option.По умолчанию:
0.
-
wchar_t *exec_prefix -
Префикс каталога, зависящего от сайта, в который устанавливаются платформозависимые файлы Python:
sys.exec_prefix.По умолчанию:
NULL.Часть результата конфигурации путей Python.
-
wchar_t *executable -
Абсолютный путь к исполняемому файлу интерпретатора Python:
sys.executable.По умолчанию:
NULL.Часть результата конфигурации путей Python.
-
int faulthandler -
Включить faulthandler?
Если значение не равно нулю, при запуске вызывается
faulthandler.enable().Получает значение
1при использовании-X faulthandlerи переменной средыPYTHONFAULTHANDLER.По умолчанию:
-1в режиме Python,0в изолированном режиме.
-
wchar_t *filesystem_encoding -
Кодировка файловой системы:
sys.getfilesystemencoding().В macOS, Android и VxWorks по умолчанию используется
"utf-8".В Windows по умолчанию используется
"utf-8"или"mbcs", если значениеlegacy_windows_fs_encodingструктурыPyPreConfigне равно нулю.Кодировка по умолчанию на других платформах:
-
"utf-8", если значениеPyPreConfig.utf8_modeне равно нулю. -
"ascii", если Python обнаруживает, чтоnl_langinfo(CODESET)сообщает о кодировке ASCII, тогда как функцияmbstowcs()декодирует данные с использованием другой кодировки (обычно Latin1). -
"utf-8", еслиnl_langinfo(CODESET)возвращает пустую строку. - В противном случае используется кодировка локали: результат
nl_langinfo(CODESET).
При запуске Python название кодировки нормализуется до имени кодека Python. Например,
"ANSI_X3.4-1968"заменяется на"ascii".См. также член
filesystem_errors. -
-
wchar_t *filesystem_errors -
Обработчик ошибок файловой системы:
sys.getfilesystemencodeerrors().В Windows по умолчанию используется
"surrogatepass"или"replace", если значениеlegacy_windows_fs_encodingструктурыPyPreConfigне равно нулю.На других платформах по умолчанию используется
"surrogateescape".Поддерживаемые обработчики ошибок:
"strict""surrogateescape"-
"surrogatepass"(поддерживается только с кодировкой UTF-8)
См. также член
filesystem_encoding.
-
unsigned long hash_seed
-
int use_hash_seed -
Начальное значение для рандомизированной хеш-функции.
Если
use_hash_seedравно нулю, при запуске Python начальное значение выбирается случайным образом, аhash_seedигнорируется.Задаётся переменной среды
PYTHONHASHSEED.Значение use_hash_seed по умолчанию:
-1в режиме Python,0в изолированном режиме.
-
wchar_t *home -
Домашний каталог Python.
Если был вызван
Py_SetPythonHome(), используется его аргумент, если он не равенNULL.Задаётся переменной среды
PYTHONHOME.По умолчанию:
NULL.Входные данные для конфигурации путей Python.
-
int import_time -
Если значение не равно нулю, измеряет время импорта.
Задаёт значение
1с помощью параметра-X importtimeи переменной средыPYTHONPROFILEIMPORTTIME.По умолчанию:
0.
-
int inspect -
Перейти в интерактивный режим после выполнения скрипта или команды.
Если значение больше
0, включается режим инспектирования: если в качестве первого аргумента передан скрипт или используется параметр -c, после выполнения скрипта или команды происходит переход в интерактивный режим, даже еслиsys.stdinне является терминалом.Увеличивается на единицу при использовании параметра командной строки
-i. Получает значение1, если переменная средыPYTHONINSPECTнепуста.По умолчанию:
0.
-
int install_signal_handlers -
Устанавливать обработчики сигналов Python?
По умолчанию:
1в режиме Python,0в изолированном режиме.
-
int interactive -
Если значение больше
0, включает интерактивный режим (REPL).Увеличивается на единицу при использовании параметра командной строки
-i.По умолчанию:
0.
-
int int_max_str_digits -
Настраивает ограничение длины строкового представления целых чисел. Начальное значение
-1означает, что значение будет взято из командной строки или среды, а в противном случае будет использовано значение по умолчанию 4300 (sys.int_info.default_max_str_digits). Значение0отключает ограничение. Значения больше нуля, но меньше 640 (sys.int_info.str_digits_check_threshold) не поддерживаются и приводят к ошибке.Настраивается флагом командной строки
-X int_max_str_digitsили переменной средыPYTHONINTMAXSTRDIGITS.По умолчанию:
-1в режиме Python. 4300 (sys.int_info.default_max_str_digits) в изолированном режиме.Добавлено в версии 3.12.
-
int isolated -
Если значение больше
0, включает изолированный режим:- Задаёт для
safe_pathзначение1: при запуске Python не добавляет в началоsys.pathпотенциально небезопасный путь, например текущий каталог, каталог скрипта или пустую строку. - Задаёт для
use_environmentзначение0: игнорирует переменные средыPYTHON. - Задаёт для
user_site_directoryзначение0: не добавляет каталог пользовательского сайта вsys.path. - REPL Python не импортирует
readlineи не включает конфигурацию readline по умолчанию в интерактивных приглашениях.
Получает значение
1при использовании параметра командной строки-I.По умолчанию:
0в режиме Python,1в изолированном режиме.См. также изолированную конфигурацию и
PyPreConfig.isolated. - Задаёт для
-
-
int legacy_windows_stdio -
Если значение отлично от нуля, используйте
io.FileIOвместоio._WindowsConsoleIOдляsys.stdin,sys.stdoutиsys.stderr.Устанавливается в
1, если переменная средыPYTHONLEGACYWINDOWSSTDIOзадана непустой строкой.Доступно только в Windows. Макрос
#ifdef MS_WINDOWSможно использовать для кода, специфичного для Windows.По умолчанию:
0.См. также PEP 528 (изменение кодировки консоли Windows на UTF-8).
-
int malloc_stats -
Если значение отлично от нуля, при завершении выводит статистику распределителя памяти Python pymalloc.
Устанавливается в
1переменной средыPYTHONMALLOCSTATS.Параметр игнорируется, если Python собран с параметром
configured using the --without-pymalloc option.По умолчанию:
0.
-
wchar_t *platlibdir -
Имя каталога библиотек платформы:
sys.platlibdir.Задаётся переменной среды
PYTHONPLATLIBDIR.По умолчанию: значение макроса
PLATLIBDIR, задаваемого параметромconfigure --with-platlibdir option(по умолчанию:"lib"или"DLLs"в Windows).Часть входных данных конфигурации путей Python.
Добавлено в версии 3.9.
Изменено в версии 3.11: Теперь этот макрос используется в Windows для поиска модулей расширения стандартной библиотеки, обычно в
DLLs. Однако для совместимости обратите внимание, что это значение игнорируется при любой нестандартной структуре каталогов, включая сборки в дереве исходного кода и виртуальные среды.
-
wchar_t *pythonpath_env -
Пути поиска модулей (
sys.path) в виде строки, разделённойDELIM(os.pathsep).Задаётся переменной среды
PYTHONPATH.По умолчанию:
NULL.Часть входных данных конфигурации путей Python.
-
PyWideStringList module_search_paths
-
int module_search_paths_set -
Пути поиска модулей:
sys.path.Если
module_search_paths_setравно0, функцияPy_InitializeFromConfig()заменитmodule_search_pathsи установитmodule_search_paths_setв1.По умолчанию: пустой список (
module_search_paths) и0(module_search_paths_set).Часть выходных данных конфигурации путей Python.
-
int optimization_level -
Уровень оптимизации компиляции:
-
0: оптимизатор peephole, установить__debug__вTrue. -
1: уровень 0, удалить утверждения, установить__debug__вFalse. -
2: уровень 1, удалить строки документации.
Увеличивается параметром командной строки
-O. Устанавливается в значение переменной средыPYTHONOPTIMIZE.По умолчанию:
0. -
-
PyWideStringList orig_argv -
Список исходных аргументов командной строки, переданных исполняемому файлу Python:
sys.orig_argv.Если список
orig_argvпуст иargvне является списком, содержащим только пустую строку,PyConfig_Read()копируетargvвorig_argvперед изменениемargv(еслиparse_argvотлично от нуля).См. также поле
argvи функциюPy_GetArgcArgv().По умолчанию: пустой список.
Добавлено в версии 3.10.
-
int parse_argv -
Разбирать аргументы командной строки?
Если значение равно
1, разбиратьargvтак же, как обычный Python разбирает аргументы командной строки, и удалять аргументы Python изargv.Функция
PyConfig_Read()разбирает аргументыPyConfig.argvтолько один раз: после разбора аргументовPyConfig.parse_argvустанавливается в2. Поскольку аргументы Python удаляются изPyConfig.argv, повторный разбор аргументов привёл бы к разбору параметров приложения как параметров Python.По умолчанию:
1в режиме Python,0в изолированном режиме.Изменено в версии 3.10: Аргументы
PyConfig.argvтеперь разбираются только в том случае, еслиPyConfig.parse_argvравно1.
-
int parser_debug -
Режим отладки анализатора. Если значение больше
0, включается вывод отладочной информации анализатора (только для специалистов; зависит от параметров компиляции).Увеличивается параметром командной строки
-d. Устанавливается в значение переменной средыPYTHONDEBUG.Требуется отладочная сборка Python (должен быть определён макрос
Py_DEBUG).По умолчанию:
0.
-
int pathconfig_warnings -
Если значение отлично от нуля, при вычислении конфигурации путей разрешается записывать предупреждения в
stderr. Если значение равно0, эти предупреждения подавляются.По умолчанию:
1в режиме Python,0в изолированном режиме.Часть входных данных конфигурации путей Python.
Изменено в версии 3.11: Теперь применяется также в Windows.
-
wchar_t *prefix -
Префикс каталога, зависящего от сайта, в который устанавливаются не зависящие от платформы файлы Python:
sys.prefix.По умолчанию:
NULL.Часть выходных данных конфигурации путей Python.
-
wchar_t *program_name -
Имя программы, используемое для инициализации
executableи в ранних сообщениях об ошибках при инициализации Python.- Если была вызвана функция
Py_SetProgramName(), используется её аргумент. - В macOS, если задана переменная среды
PYTHONEXECUTABLE, используется её значение. - Если определён макрос
WITH_NEXT_FRAMEWORK, используется значение переменной среды__PYVENV_LAUNCHER__, если она задана. - Если доступен и не пуст, используется
argv[0]изargv. - В противном случае в Windows используется
L"python", а на других платформах —L"python3".
По умолчанию:
NULL.Часть входных данных конфигурации путей Python.
- Если была вызвана функция
-
wchar_t *pycache_prefix -
Каталог, в который записываются кэшированные файлы
.pyc:sys.pycache_prefix.Задаётся параметром командной строки
-X pycache_prefix=PATHи переменной средыPYTHONPYCACHEPREFIX.Если
NULL,sys.pycache_prefixустанавливается вNone.По умолчанию:
NULL.
-
int quiet -
Тихий режим. Если значение больше
0, при запуске Python в интерактивном режиме не отображаются сведения об авторских правах и версия.Увеличивается параметром командной строки
-q.По умолчанию:
0.
-
wchar_t *run_command -
Значение параметра командной строки
-c.Используется функцией
Py_RunMain().По умолчанию:
NULL.
-
wchar_t *run_filename -
Имя файла, переданное в командной строке: последний аргумент командной строки без
-cили-m. Используется функциейPy_RunMain().Например, при запуске из командной строки
python3 script.py argему присваивается значениеscript.py.См. также параметр
PyConfig.skip_source_first_line.По умолчанию:
NULL.
-
wchar_t *run_module -
Значение параметра командной строки
-m.Используется функцией
Py_RunMain().По умолчанию:
NULL.
-
int show_ref_count -
Показывать общее число ссылок при завершении (за исключением бессмертных объектов)?
Устанавливается в
1параметром командной строки-X showrefcount.Требуется отладочная сборка Python (должен быть определён макрос
Py_REF_DEBUG).По умолчанию:
0.
-
int site_import -
Импортировать модуль
siteпри запуске?Если значение равно нулю, отключается импорт модуля site и связанные с ним изменения
sys.path, зависящие от сайта.Эти изменения также отключаются, если модуль
siteявно импортируется позднее (вызовитеsite.main(), если хотите их применить).Устанавливается в
0параметром командной строки-S.sys.flags.no_siteполучает значение, обратное значениюsite_import.По умолчанию:
1.
-
int skip_source_first_line -
Если значение отлично от нуля, пропускает первую строку исходного файла
PyConfig.run_filename.Это позволяет использовать формы
#!cmd, отличные от Unix. Предназначено только для специфичного для DOS обходного решения.Устанавливается в
1параметром командной строки-x.По умолчанию:
0.
-
wchar_t *stdio_encoding
-
wchar_t *stdio_errors -
Кодировка и обработка ошибок кодирования для
sys.stdin,sys.stdoutиsys.stderr(однакоsys.stderrвсегда использует обработчик ошибок"backslashreplace").Если была вызвана функция
Py_SetStandardStreamEncoding(), используйте её аргументы error и errors, если они не равныNULL.Используйте переменную среды
PYTHONIOENCODING, если она не пуста.Кодировка по умолчанию:
-
"UTF-8", еслиPyPreConfig.utf8_modeотлично от нуля. - В противном случае используется кодировка локали.
Обработчик ошибок по умолчанию:
- В Windows: используется
"surrogateescape". -
"surrogateescape", еслиPyPreConfig.utf8_modeотлично от нуля или локаль LC_CTYPE имеет значение «C» или «POSIX». -
"strict"в остальных случаях.
-
-
int tracemalloc -
Включить tracemalloc?
Если значение отлично от нуля, при запуске вызывается
tracemalloc.start().Задаётся параметром командной строки
-X tracemalloc=Nи переменной средыPYTHONTRACEMALLOC.По умолчанию:
-1в режиме Python,0в изолированном режиме.
-
int perf_profiling -
Включить режим совместимости с профилировщиком perf?
Если значение отлично от нуля, инициализируется трамплин perf. Подробнее см. в разделе Поддержка профилировщика Linux perf в Python.
Задаётся параметром командной строки
-X perfи переменной средыPYTHONPERFSUPPORT.По умолчанию:
-1.Добавлено в версии 3.12.
-
int use_environment -
Использовать переменные среды?
Если значение равно нулю, переменные среды игнорируются.
Устанавливается в
0переменной среды-E.По умолчанию:
1в конфигурации Python и0в изолированной конфигурации.
-
int user_site_directory -
Если значение отлично от нуля, добавляет пользовательский каталог site в
sys.path.Устанавливается в
0параметрами командной строки-sи-I.Устанавливается в
0переменной средыPYTHONNOUSERSITE.По умолчанию:
1в режиме Python,0в изолированном режиме.
-
int verbose -
Подробный режим. Если значение больше
0, при каждом импорте модуля выводится сообщение с указанием места, из которого он загружен (имя файла или встроенный модуль).Если значение больше или равно
2, выводится сообщение для каждого файла, проверяемого при поиске модуля. Кроме того, при завершении выводятся сведения об очистке модулей.Увеличивается параметром командной строки
-v.Устанавливается в значение переменной среды
PYTHONVERBOSE.По умолчанию:
0.
-
PyWideStringList warnoptions -
Параметры модуля
warningsдля создания фильтров предупреждений, от наименьшего приоритета к наибольшему:sys.warnoptions.Модуль
warningsдобавляет элементы вsys.warnoptionsв обратном порядке: последний элементPyConfig.warnoptionsстановится первым элементомwarnings.filters, который проверяется первым (имеет наивысший приоритет).Параметр командной строки
-Wдобавляет своё значение вwarnoptions; его можно использовать несколько раз.Переменную среды
PYTHONWARNINGSтакже можно использовать для добавления параметров предупреждений. Можно указать несколько параметров, разделив их запятыми (,).По умолчанию: пустой список.
-
int write_bytecode -
Если значение равно
0, Python не будет пытаться записывать файлы.pycпри импорте исходных модулей.Устанавливается в
0параметром командной строки-Bи переменной средыPYTHONDONTWRITEBYTECODE.sys.dont_write_bytecodeинициализируется значением, обратным значениюwrite_bytecode.По умолчанию:
1.
-
PyWideStringList xoptions -
Значения параметров командной строки
-X:sys._xoptions.По умолчанию: пустой список.
-
Если parse_argv отлично от нуля, аргументы argv разбираются так же, как обычный Python разбирает аргументы командной строки, а аргументы Python удаляются из argv.
Параметры xoptions разбираются для установки других параметров: см. параметр командной строки -X.
Изменено в версии 3.9: Поле show_alloc_count удалено.
Инициализация с помощью 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.
Текущая конфигурация (тип PyConfig) хранится в PyInterpreterState.config.
Пример задания имени программы:
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 exception;
}
status = Py_InitializeFromConfig(&config);
if (PyStatus_Exception(status)) {
goto exception;
}
PyConfig_Clear(&config);
return;
exception:
PyConfig_Clear(&config);
Py_ExitStatusException(status);
}
Более полный пример изменяет конфигурацию по умолчанию, считывает её, а затем переопределяет некоторые параметры. Обратите внимание: начиная с версии 3.11 многие параметры вычисляются только во время инициализации, поэтому их значения нельзя прочитать из структуры конфигурации. Значения, установленные до вызова инициализации, останутся без изменений:
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;
}
/* Specify sys.path explicitly */
/* If you want to modify the default set of paths, finish
initialization first and then use PySys_GetObject("path") */
config.module_search_paths_set = 1;
status = PyWideStringList_Append(&config.module_search_paths,
L"/path/to/stdlib");
if (PyStatus_Exception(status)) {
goto done;
}
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 не анализируется) и пользовательский каталог site. Стандартные потоки C (например, stdout) и локаль LC_CTYPE остаются без изменений. Обработчики сигналов не устанавливаются.
Файлы конфигурации по-прежнему используются с этой конфигурацией для определения путей, которые не заданы. Убедитесь, что указан параметр PyConfig.home, чтобы избежать вычисления конфигурации путей по умолчанию.
Конфигурация Python
Функции PyPreConfig_InitPythonConfig() и PyConfig_InitPythonConfig() создают конфигурацию для сборки настроенной версии Python, которая ведёт себя как обычный Python.
Для настройки Python используются переменные окружения и аргументы командной строки, а глобальные переменные конфигурации игнорируются.
Эта функция включает принудительное использование локали C (PEP 538) и режим UTF-8 в Python (PEP 540) в зависимости от локали LC_CTYPE, переменных окружения PYTHONUTF8 и PYTHONCOERCECLOCALE.
Конфигурация путей Python
PyConfig содержит несколько полей для конфигурации путей:
-
Входные данные конфигурации путей:
PyConfig.homePyConfig.platlibdirPyConfig.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. В этом случае module_search_paths будет использоваться без изменений.
Установите для 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 не равно нулю, модуль site может изменять sys.path. Если user_site_directory не равно нулю и каталог site-packages пользователя существует, модуль site добавляет каталог site-packages пользователя в sys.path.
Для конфигурации путей используются следующие файлы конфигурации:
pyvenv.cfg-
файл
._pth(например,python._pth) -
pybuilddir.txt(только для Unix)
Если присутствует файл ._pth:
- Установите для
isolatedзначение1. - Установите для
use_environmentзначение0. - Установите для
site_importзначение0. - Установите для
safe_pathзначение1.
Переменная окружения __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, которая всегда запускается в изолированном режиме с использованием Py_RunMain(), см. в разделе Конфигурация Python.
Py_GetArgcArgv()
-
void Py_GetArgcArgv(int *argc, wchar_t ***argv) -
Получить исходные аргументы командной строки, до того как Python изменил их.
См. также поле
PyConfig.orig_argv.
Частный предварительный API многоэтапной инициализации
В этом разделе описан частный предварительный API, реализующий многоэтапную инициализацию — ключевую возможность PEP 432:
-
Этап «Core», «минимально необходимый Python»:
- Встроенные типы;
- Встроенные исключения;
- Встроенные и замороженные модули;
- Модуль
sysинициализирован лишь частично (например,sys.pathещё не существует).
-
Этап «Main», 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: конфигурация путей применяется только на этапе «Main». Это может позволить настроить Python на Python, чтобы переопределить или скорректировать конфигурацию путей, возможно, установить собственный импортёр sys.meta_path или хук импорта и т. д.
Возможно, станет доступно вычисление конфигурации путей на Python после этапа Core и до этапа Main — это одна из целей PEP 432.
Этап «Core» определён недостаточно чётко: пока не указано, что должно и что не должно быть доступно на этом этапе. API помечен как частный и предварительный: его можно изменить или даже удалить в любое время до разработки полноценного общедоступного API.
Пример выполнения кода Python между этапами инициализации «Core» и «Main»:
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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/c-api/init_config.html