Spec-Zone.ru › Python 3.14

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

C API PyInitConfig

Добавлено в версии 3.14.

Python можно инициализировать с помощью Py_InitializeFromInitConfig().

Функцию Py_RunMain() можно использовать для создания пользовательской программы на Python.

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

См. также

PEP 741 «C API конфигурации Python».

Пример

Пример пользовательской программы на Python, которая всегда работает с включённым режимом разработки Python; в случае ошибки возвращает -1:

int init_python(void)
{
    PyInitConfig *config = PyInitConfig_Create();
    if (config == NULL) {
        printf("PYTHON INIT ERROR: memory allocation failed\n");
        return -1;
    }

    // Enable the Python Development Mode
    if (PyInitConfig_SetInt(config, "dev_mode", 1) < 0) {
        goto error;
    }

    // Initialize Python with the configuration
    if (Py_InitializeFromInitConfig(config) < 0) {
        goto error;
    }
    PyInitConfig_Free(config);
    return 0;

error:
    {
        // Display the error message.
        //
        // This uncommon braces style is used, because you cannot make
        // goto targets point to variable declarations.
        const char *err_msg;
        (void)PyInitConfig_GetError(config, &err_msg);
        printf("PYTHON INIT ERROR: %s\n", err_msg);
        PyInitConfig_Free(config);
        return -1;
    }
}

Создание конфигурации

struct PyInitConfig

Непрозрачная структура для настройки инициализации Python.

PyInitConfig *PyInitConfig_Create(void)

Создаёт новую конфигурацию инициализации со значениями по умолчанию из изолированной конфигурации.

Её необходимо освободить с помощью PyInitConfig_Free().

При сбое выделения памяти возвращает NULL.

void PyInitConfig_Free(PyInitConfig *config)

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

Если config равен NULL, операция не выполняется.

Обработка ошибок

int PyInitConfig_GetError(PyInitConfig *config, const char **err_msg)

Получает сообщение об ошибке config.

  • Устанавливает *err_msg и возвращает 1, если задана ошибка.
  • В противном случае устанавливает *err_msg в NULL и возвращает 0.

Сообщение об ошибке представляет собой строку в кодировке UTF-8.

Если для config задан код завершения, он форматируется как сообщение об ошибке.

Сообщение об ошибке остаётся действительным до вызова другой функции PyInitConfig с параметром config. Вызывающей стороне не нужно освобождать память сообщения об ошибке.

int PyInitConfig_GetExitCode(PyInitConfig *config, int *exitcode)

Получает код завершения config.

  • Устанавливает *exitcode и возвращает 1, если для config задан код завершения.
  • Возвращает 0, если для config не задан код завершения.

Только функция Py_InitializeFromInitConfig() может задать код завершения, если параметр parse_argv ненулевой.

Код завершения может быть задан, если не удалось обработать командную строку (код завершения 2) или параметр командной строки запрашивает отображение справки по командной строке (код завершения 0).

Получение параметров

Параметр name для параметра конфигурации должен быть ненулевой строкой с завершающим нулём в кодировке UTF-8. См. Параметры конфигурации.

int PyInitConfig_HasOption(PyInitConfig *config, const char *name)

Проверяет, содержит ли конфигурация параметр с именем name.

Возвращает 1, если параметр существует, и 0 в противном случае.

int PyInitConfig_GetInt(PyInitConfig *config, const char *name, int64_t *value)

Получает целочисленный параметр конфигурации.

  • Устанавливает *value и при успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.
int PyInitConfig_GetStr(PyInitConfig *config, const char *name, char **value)

Получает строковый параметр конфигурации в виде строки с завершающим нулём в кодировке UTF-8.

  • Устанавливает *value и при успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.

Значению *value может быть присвоено NULL, если параметр является необязательной строкой и не задан.

При успехе строку необходимо освободить с помощью free(value), если она не равна NULL.

int PyInitConfig_GetStrList(PyInitConfig *config, const char *name, size_t *length, char ***items)

Получает список строковых параметров конфигурации в виде массива строк с завершающим нулём в кодировке UTF-8.

  • Устанавливает *length и *value и при успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.

При успехе список строк необходимо освободить с помощью PyInitConfig_FreeStrList(length, items).

void PyInitConfig_FreeStrList(size_t length, char **items)

Освобождает память списка строк, созданного с помощью PyInitConfig_GetStrList().

Установка параметров

Параметр name для параметра конфигурации должен быть ненулевой строкой с завершающим нулём в кодировке UTF-8. См. Параметры конфигурации.

Некоторые параметры конфигурации влияют на другие параметры. Эта логика реализована только при вызове Py_InitializeFromInitConfig(), но не в приведённых ниже функциях «Set». Например, установка dev_mode в значение 1 не устанавливает faulthandler в значение 1.

int PyInitConfig_SetInt(PyInitConfig *config, const char *name, int64_t value)

Устанавливает целочисленный параметр конфигурации.

  • При успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.
int PyInitConfig_SetStr(PyInitConfig *config, const char *name, const char *value)

Устанавливает строковый параметр конфигурации из строки с завершающим нулём в кодировке UTF-8. Строка копируется.

  • При успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.
int PyInitConfig_SetStrList(PyInitConfig *config, const char *name, size_t length, char *const *items)

Устанавливает список строковых параметров конфигурации из массива строк с завершающим нулём в кодировке UTF-8. Список строк копируется.

  • При успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.

Модуль

int PyInitConfig_AddModule(PyInitConfig *config, const char *name, PyObject *(*initfunc)(void))

Добавляет встроенный модуль расширения в таблицу встроенных модулей.

Новый модуль можно импортировать по имени name; функция initfunc будет использоваться как функция инициализации, вызываемая при первой попытке импорта.

  • При успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.

Если Python инициализируется несколько раз, PyInitConfig_AddModule() необходимо вызывать при каждой инициализации Python.

Аналогично функции PyImport_AppendInittab().

Инициализация Python

int Py_InitializeFromInitConfig(PyInitConfig *config)

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

  • При успехе возвращает 0.
  • При ошибке устанавливает ошибку в config и возвращает -1.
  • Если Python требуется завершить работу, устанавливает код завершения в config и возвращает -1.

См. PyInitConfig_GetExitcode() для случая с кодом завершения.

Параметры конфигурации

Параметр

Поле PyConfig/PyPreConfig

Тип

Доступность

"allocator"

allocator

int

Только для чтения

"argv"

argv

list[str]

Общедоступный

"base_exec_prefix"

base_exec_prefix

str

Общедоступный

"base_executable"

base_executable

str

Общедоступный

"base_prefix"

base_prefix

str

Общедоступный

"buffered_stdio"

buffered_stdio

bool

Только для чтения

"bytes_warning"

bytes_warning

int

Общедоступный

"check_hash_pycs_mode"

check_hash_pycs_mode

str

Только для чтения

"code_debug_ranges"

code_debug_ranges

bool

Только для чтения

"coerce_c_locale"

coerce_c_locale

bool

Только для чтения

"coerce_c_locale_warn"

coerce_c_locale_warn

bool

Только для чтения

"configure_c_stdio"

configure_c_stdio

bool

Только для чтения

"configure_locale"

configure_locale

bool

Только для чтения

"cpu_count"

cpu_count

int

Общедоступный

"dev_mode"

dev_mode

bool

Только для чтения

"dump_refs"

dump_refs

bool

Только для чтения

"dump_refs_file"

dump_refs_file

str

Только для чтения

"exec_prefix"

exec_prefix

str

Общедоступный

"executable"

executable

str

Общедоступный

"faulthandler"

faulthandler

bool

Только для чтения

"filesystem_encoding"

filesystem_encoding

str

Только для чтения

"filesystem_errors"

filesystem_errors

str

Только для чтения

"hash_seed"

hash_seed

int

Только для чтения

"home"

home

str

Только для чтения

"import_time"

import_time

int

Только для чтения

"inspect"

inspect

bool

Общедоступный

"install_signal_handlers"

install_signal_handlers

bool

Только для чтения

"int_max_str_digits"

int_max_str_digits

int

Общедоступный

"interactive"

interactive

bool

Общедоступный

"isolated"

isolated

bool

Только для чтения

"legacy_windows_fs_encoding"

legacy_windows_fs_encoding

bool

Только для чтения

"legacy_windows_stdio"

legacy_windows_stdio

bool

Только для чтения

"malloc_stats"

malloc_stats

bool

Только для чтения

"module_search_paths"

module_search_paths

list[str]

Общедоступный

"optimization_level"

optimization_level

int

Общедоступный

"orig_argv"

orig_argv

list[str]

Только для чтения

"parse_argv"

parse_argv

bool

Только для чтения

"parser_debug"

parser_debug

bool

Общедоступный

"pathconfig_warnings"

pathconfig_warnings

bool

Только для чтения

"perf_profiling"

perf_profiling

bool

Только для чтения

"platlibdir"

platlibdir

str

Общедоступный

"prefix"

prefix

str

Общедоступный

"program_name"

program_name

str

Только для чтения

"pycache_prefix"

pycache_prefix

str

Общедоступный

"quiet"

quiet

bool

Общедоступный

"run_command"

run_command

str

Только для чтения

"run_filename"

run_filename

str

Только для чтения

"run_module"

run_module

str

Только для чтения

"run_presite"

run_presite

str

Только для чтения

"safe_path"

safe_path

bool

Только для чтения

"show_ref_count"

show_ref_count

bool

Только для чтения

"site_import"

site_import

bool

Только для чтения

"skip_source_first_line"

skip_source_first_line

bool

Только для чтения

"stdio_encoding"

stdio_encoding

str

Только для чтения

"stdio_errors"

stdio_errors

str

Только для чтения

"stdlib_dir"

stdlib_dir

str

Общедоступный

"tracemalloc"

tracemalloc

int

Только для чтения

"use_environment"

use_environment

bool

Общедоступный

"use_frozen_modules"

use_frozen_modules

bool

Только для чтения

"use_hash_seed"

use_hash_seed

bool

Только для чтения

"use_system_logger"

use_system_logger

bool

Только для чтения

"user_site_directory"

user_site_directory

bool

Только для чтения

"utf8_mode"

utf8_mode

bool

Только для чтения

"verbose"

verbose

int

Общедоступный

"warn_default_encoding"

warn_default_encoding

bool

Только для чтения

"warnoptions"

warnoptions

list[str]

Общедоступный

"write_bytecode"

write_bytecode

bool

Общедоступный

"xoptions"

xoptions

dict[str, str]

Общедоступный

"_pystats"

_pystats

bool

Только для чтения

Доступность:

  • Общедоступный: можно получить с помощью PyConfig_Get() и задать с помощью PyConfig_Set().
  • Только для чтения: можно получить с помощью PyConfig_Get(), но нельзя задать с помощью PyConfig_Set().

API конфигурации Python во время выполнения

Во время выполнения можно получать и задавать параметры конфигурации с помощью функций PyConfig_Get() и PyConfig_Set().

Параметр name параметра конфигурации должен быть ненулевой строкой UTF-8 с завершающим нулевым байтом. См. раздел Параметры конфигурации.

Некоторые параметры считываются из атрибутов sys. Например, параметр "argv" считывается из sys.argv.

PyObject *PyConfig_Get(const char *name)

Получить текущее значение параметра конфигурации во время выполнения в виде объекта Python.

  • В случае успеха возвращает новую ссылку.
  • В случае ошибки устанавливает исключение и возвращает NULL.

Тип объекта зависит от параметра конфигурации. Это может быть:

  • bool
  • int
  • str
  • list[str]
  • dict[str, str]

У вызывающего потока должно быть присоединённое состояние потока. Функцию нельзя вызывать до инициализации Python или после его завершения.

Добавлено в версии 3.14.

int PyConfig_GetInt(const char *name, int *value)

Аналогично PyConfig_Get(), но значение возвращается в виде C int.

  • В случае успеха возвращает 0.
  • В случае ошибки устанавливает исключение и возвращает -1.

Добавлено в версии 3.14.

PyObject *PyConfig_Names(void)

Получить все имена параметров конфигурации в виде frozenset.

  • В случае успеха возвращает новую ссылку.
  • В случае ошибки устанавливает исключение и возвращает NULL.

У вызывающего потока должно быть присоединённое состояние потока. Функцию нельзя вызывать до инициализации Python или после его завершения.

Добавлено в версии 3.14.

int PyConfig_Set(const char *name, PyObject *value)

Задать текущее значение параметра конфигурации во время выполнения.

  • Вызывает ValueError, если параметра с именем name не существует.
  • Вызывает ValueError, если value имеет недопустимое значение.
  • Вызывает ValueError, если параметр доступен только для чтения (его нельзя задать).
  • Вызывает TypeError, если value имеет неверный тип.

У вызывающего потока должно быть присоединённое состояние потока. Функцию нельзя вызывать до инициализации Python или после его завершения.

Вызывает событие аудита cpython.PyConfig_Set с аргументами name, value.

Добавлено в версии 3.14.

Изменено в версии 3.14.7: Теперь функция заменяет sys.flags (создаёт новый объект), а не изменяет sys.flags на месте.

Интерфейс PyConfig для C

Добавлено в версии 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_MIMALLOC (6): использовать mimalloc — быструю замену malloc.
  • PYMEM_ALLOCATOR_MIMALLOC_DEBUG (7): использовать mimalloc — быструю замену malloc с отладочными перехватчиками.

PYMEM_ALLOCATOR_PYMALLOC и PYMEM_ALLOCATOR_PYMALLOC_DEBUG не поддерживаются, если Python собран с параметром configured using --without-pymalloc.

PYMEM_ALLOCATOR_MIMALLOC и PYMEM_ALLOCATOR_MIMALLOC_DEBUG не поддерживаются, если Python собран с параметром configured using --without-mimalloc или если базовая поддержка атомарных операций недоступна.

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

По умолчанию: 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.dev_mode
  • PyConfig.isolated
  • PyConfig.parse_argv
  • PyConfig.use_environment

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

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

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

PyWideStringList argv

Задаёт аргументы командной строки sys.argv на основе argv. Эти параметры аналогичны передаваемым функции main() программы, за исключением того, что первая запись должна указывать на запускаемый файл скрипта, а не на исполняемый файл, содержащий интерпретатор Python. Если скрипт не запускается, первая запись в 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

sys.base_exec_prefix.

По умолчанию: NULL.

Часть выходных данных конфигурации путей Python.

См. также PyConfig.exec_prefix.

wchar_t *base_executable

Базовый исполняемый файл Python: sys._base_executable.

Задаётся переменной среды __PYVENV_LAUNCHER__.

Получает значение из PyConfig.executable, если NULL.

По умолчанию: NULL.

Часть выходных данных конфигурации путей Python.

См. также PyConfig.executable.

wchar_t *base_prefix

sys.base_prefix.

По умолчанию: NULL.

Часть выходных данных конфигурации путей Python.

См. также PyConfig.prefix.

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 использует кодировку по умолчанию. Подробности см. в разделе Включение предупреждений о кодировке.

По умолчанию: 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 в изолированной конфигурации.

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 *dump_refs_file

Имя файла, в который выводится дамп ссылок Python.

Задаётся переменной среды PYTHONDUMPREFSFILE.

По умолчанию: NULL.

Добавлено в версии 3.11.

wchar_t *exec_prefix

Префикс каталога, специфичного для платформы, в который установлены платформозависимые файлы Python: sys.exec_prefix.

По умолчанию: NULL.

Часть выходных данных конфигурации путей Python.

См. также PyConfig.base_exec_prefix.

wchar_t *executable

Абсолютный путь к исполняемому файлу интерпретатора Python: sys.executable.

По умолчанию: NULL.

Часть выходных данных конфигурации путей Python.

См. также PyConfig.base_executable.

int 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.

int use_frozen_modules

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

Задаётся переменной среды PYTHON_FROZEN_MODULES.

По умолчанию: 1 в выпускной сборке или 0 в отладочной сборке.

unsigned long hash_seed
int use_hash_seed

Начальное значение рандомизированной хеш-функции.

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

Задаётся переменной среды PYTHONHASHSEED.

Значение use_hash_seed по умолчанию: -1 в режиме Python, 0 в изолированном режиме.

wchar_t *home

Задаёт каталог «home» Python по умолчанию, то есть расположение стандартных библиотек Python (см. PYTHONHOME).

Задаётся переменной среды PYTHONHOME.

По умолчанию: NULL.

Часть входных данных конфигурации путей Python.

int import_time

Если значение равно 1, профилирует время импорта. Если значение равно 2, включает дополнительные сведения о том, что импортированный модуль уже был загружен.

Задаётся параметром -X importtime и переменной среды PYTHONPROFILEIMPORTTIME.

По умолчанию: 0.

Изменено в версии 3.14: Добавлена поддержка import_time = 2

int inspect

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

Если значение больше 0, включает режим inspect: если скрипт передан первым аргументом или используется параметр -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 cpu_count

Если значение cpu_count не равно -1, оно переопределяет значения, возвращаемые функциями os.cpu_count(), os.process_cpu_count() и multiprocessing.cpu_count().

Настраивается флагом командной строки -X cpu_count=n|default или переменной окружения PYTHON_CPU_COUNT.

По умолчанию: -1.

Добавлено в версии 3.13.

int isolated

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

  • Установить safe_path в 1: не добавлять в начало sys.path потенциально небезопасный путь при запуске Python, например текущий каталог, каталог скрипта или пустую строку.
  • Установить use_environment в 0: игнорировать переменные окружения PYTHON.
  • Установить user_site_directory в 0: не добавлять пользовательский каталог site в sys.path.
  • REPL Python не импортирует readline и не включает настройки readline по умолчанию в интерактивных приглашениях.

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

По умолчанию: 0 в режиме Python, 1 в изолированном режиме.

См. также изолированную конфигурацию и PyPreConfig.isolated.

int legacy_windows_stdio

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

Устанавливается в 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.

См. также PyConfig.base_prefix.

wchar_t *program_name

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

  • В macOS используется переменная окружения PYTHONEXECUTABLE, если она задана.
  • Если определён макрос WITH_NEXT_FRAMEWORK, используется переменная окружения __PYVENV_LAUNCHER__, если она задана.
  • Если доступен и не пуст, используется argv[0] из argv.
  • В противном случае используется L"python" в Windows или 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.

wchar_t *run_presite

Путь package.module к модулю, который следует импортировать до запуска site.py.

Задаётся параметром командной строки -X presite=package.module и переменной окружения PYTHON_PRESITE. Параметр командной строки имеет приоритет.

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

По умолчанию: 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").

Если переменная окружения PYTHONIOENCODING не пуста, используется её значение.

Кодировка по умолчанию:

  • "UTF-8", если PyPreConfig.utf8_mode не равно нулю.
  • В противном случае используется кодировка локали.

Обработчик ошибок по умолчанию:

  • В Windows используется "surrogateescape".
  • "surrogateescape", если PyPreConfig.utf8_mode не равно нулю или локаль LC_CTYPE имеет значение «C» или «POSIX».
  • "strict" в остальных случаях.

См. также PyConfig.legacy_windows_stdio.

int tracemalloc

Включить tracemalloc?

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

Задаётся параметром командной строки -X tracemalloc=N и переменной окружения PYTHONTRACEMALLOC.

По умолчанию: -1 в режиме Python, 0 в изолированном режиме.

int perf_profiling

Включить поддержку профилировщика Linux perf?

Если значение равно 1, включается поддержка профилировщика Linux perf.

Если значение равно 2, включается поддержка профилировщика Linux perf с поддержкой JIT DWARF.

Устанавливается в 1 параметром командной строки -X perf и переменной окружения PYTHONPERFSUPPORT.

Устанавливается в 2 параметром командной строки -X perf_jit и переменной окружения PYTHON_PERF_JIT_SUPPORT.

По умолчанию: -1.

См. также

Дополнительные сведения см. в разделе Поддержка профилировщика Linux perf в Python.

Добавлено в версии 3.12.

wchar_t *stdlib_dir

Каталог стандартной библиотеки Python.

По умолчанию: NULL.

Добавлено в версии 3.11.

int use_environment

Использовать переменные окружения?

Если значение равно нулю, переменные окружения игнорируются.

Устанавливается в 0 переменной окружения -E.

По умолчанию: 1 в конфигурации Python и 0 в изолированной конфигурации.

int use_system_logger

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

Доступно только в macOS 10.12 и более поздних версиях, а также в iOS.

По умолчанию: 0 (системный журнал не используется) в macOS; 1 в iOS (системный журнал используется).

Добавлено в версии 3.14.

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.

По умолчанию: пустой список.

int _pystats

Если значение не равно нулю, при завершении работы Python записывается статистика производительности.

Требуется специальная сборка с макросом Py_STATS: см. --enable-pystats.

По умолчанию: 0.

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

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

Изменено в версии 3.9: Поле show_alloc_count удалено.

Инициализация с помощью PyConfig

Инициализация интерпретатора из заполненной структуры конфигурации выполняется вызовом Py_InitializeFromConfig().

Вызывающая сторона должна обрабатывать исключения (ошибки или завершение работы) с помощью 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.home
    • PyConfig.platlibdir
    • PyConfig.pathconfig_warnings
    • PyConfig.program_name
    • PyConfig.pythonpath_env
    • текущий рабочий каталог: для получения абсолютных путей
    • переменная окружения PATH для получения полного пути к программе (из PyConfig.program_name)
    • переменная окружения __PYVENV_LAUNCHER__
    • (только Windows) Пути приложений в реестре по адресу “SoftwarePythonPythonCoreX.YPythonPath” в разделах HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE (где X.Y — версия Python).
  • Выходные поля конфигурации путей:

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

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

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

Если параметр home не задан и файл pyvenv.cfg присутствует в том же каталоге, что и executable, или в его родительском каталоге, prefix и exec_prefix устанавливаются в этот путь. В этом случае base_prefix и base_exec_prefix сохраняют свои значения, указывающие на базовую установку. Дополнительные сведения см. в разделе Виртуальные окружения.

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

Изменено в версии 3.14: Теперь prefix и exec_prefix устанавливаются в каталог pyvenv.cfg. Ранее это выполнял модуль site, поэтому на это влиял параметр -S.

Py_GetArgcArgv()

void Py_GetArgcArgv(int *argc, wchar_t ***argv)

Получить исходные аргументы командной строки до того, как Python изменил их.

См. также поле PyConfig.orig_argv.

Отложенный запуск главного модуля

В некоторых сценариях встраивания может быть полезно разделить инициализацию интерпретатора и выполнение главного модуля.

Для этого во время инициализации можно установить PyConfig.run_command в пустую строку (чтобы интерпретатор не переходил в интерактивный режим), а затем выполнить код требуемого главного модуля, используя __main__.__dict__ в качестве глобального пространства имён.

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

Spec-Zone.ru

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