Spec-Zone.ru › Python 3.9

Настройка инициализации Python

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

Структуры:

  • PyConfig
  • PyPreConfig
  • PyStatus
  • PyWideStringList

Функции:

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

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

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

См. также

PEP 587 «Настройка инициализации Python».

PyWideStringList

PyWideStringList

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

Если length не равно нулю, items не должны быть NULL, и все строки должны быть не NULL.

Методы:

PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)

Добавить item в список list.

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

PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)

Вставить item в список list по индексу index.

Если index больше или равен длине list, добавить item в list.

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

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

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

Py_ssize_t length

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

wchar_t** items

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

PyStatus

PyStatus

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

В случае ошибки она может хранить имя C-функции, которая создала ошибку.

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

int exitcode

Код завершения. Аргумент, переданный в exit().

const char *err_msg

Сообщение об ошибке.

const char *func

Имя функции, которая создала ошибку, может быть NULL.

Функции для создания состояния:

PyStatus PyStatus_Ok(void)

Успех.

PyStatus PyStatus_Error(const char *err_msg)

Ошибка инициализации с сообщением.

PyStatus PyStatus_NoMemory(void)

Ошибка выделения памяти (недостаточно памяти).

PyStatus PyStatus_Exit(int exitcode)

Завершить Python с указанным кодом выхода.

Функции для обработки состояния:

int PyStatus_Exception(PyStatus status)

Является ли состояние ошибкой или выходом? Если истинно, исключение должно быть обработано; например, вызвав Py_ExitStatusException().

int PyStatus_IsError(PyStatus status)

Результат ошибка?

int PyStatus_IsExit(PyStatus status)

Результат выход?

void Py_ExitStatusException(PyStatus status)

Вызвать exit(exitcode) если status является выходом. Вывести сообщение об ошибке и выйти с ненулевым кодом выхода, если status является ошибкой. Должен быть вызван только в том случае, если PyStatus_Exception(status) не равно нулю.

Примечание

Внутри Python используются макросы, которые устанавливают PyStatus.func, в то время как функции для создания состояния устанавливают func в NULL.

Пример:

PyStatus alloc(void **ptr, size_t size)
{
    *ptr = PyMem_RawMalloc(size);
    if (*ptr == NULL) {
        return PyStatus_NoMemory();
    }
    return PyStatus_Ok();
}

int main(int argc, char **argv)
{
    void *ptr;
    PyStatus status = alloc(&ptr, 16);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }
    PyMem_Free(ptr);
    return 0;
}

PyPreConfig

PyPreConfig

Структура, используемая для предварительной инициализации Python:

  • Устанавливает аллокатор памяти Python
  • Настраивает локаль LC_CTYPE
  • Устанавливает режим UTF-8

Функция для инициализации предварительной конфигурации:

void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)

Инициализирует предварительную конфигурацию с помощью Конфигурации Python.

void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)

Инициализирует предварительную конфигурацию с помощью Изолированной конфигурации.

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

int allocator

Имя аллокатора памяти:

  • PYMEM_ALLOCATOR_NOT_SET (0): не менять аллокатор памяти (использовать значения по умолчанию)
  • PYMEM_ALLOCATOR_DEFAULT (1): аллокаторы памяти по умолчанию
  • PYMEM_ALLOCATOR_DEBUG (2): аллокаторы памяти по умолчанию с отладкой
  • PYMEM_ALLOCATOR_MALLOC (3): принудительно использовать malloc()
  • PYMEM_ALLOCATOR_MALLOC_DEBUG (4): принудительно использовать malloc() с отладкой
  • PYMEM_ALLOCATOR_PYMALLOC (5): Аллокатор памяти Python pymalloc
  • PYMEM_ALLOCATOR_PYMALLOC_DEBUG (6): Аллокатор памяти Python pymalloc с отладкой

PYMEM_ALLOCATOR_PYMALLOC и PYMEM_ALLOCATOR_PYMALLOC_DEBUG не поддерживаются, если Python сконфигурирован с использованием --without-pymalloc

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

int configure_locale

Установить локаль LC_CTYPE на предпочтительную локаль пользователя? Если равно 0, установить coerce_c_locale и coerce_c_locale_warn в 0.

int coerce_c_locale

Если равно 2, принудительно использовать C локаль; если равно 1, прочитать локаль LC_CTYPE, чтобы решить, следует ли ее принудительно использовать.

int coerce_c_locale_warn

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

int dev_mode

См. PyConfig.dev_mode.

int isolated

См. PyConfig.isolated.

int legacy_windows_fs_encoding(Windows only)

Если отлична от нуля, отключить режим UTF-8, установить кодировку файловой системы Python в mbcs, установить обработчик ошибок файловой системы в replace.

Доступно только в Windows. Макрос #ifdef MS_WINDOWS может использоваться для кода, специфичного для Windows.

int parse_argv

Если отлична от нуля, Py_PreInitializeFromArgs() и Py_PreInitializeFromBytesArgs() анализируют аргумент argv так же, как обычный Python анализирует аргументы командной строки: см. Аргументы командной строки.

int use_environment

См. PyConfig.use_environment.

int utf8_mode

Если отлична от нуля, включить режим UTF-8.

Предварительная инициализация с PyPreConfig

Функции для предварительной инициализации Python:

PyStatus Py_PreInitialize(const PyPreConfig *preconfig)

Предварительно инициализировать Python из предварительной конфигурации preconfig.

PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv)

Предварительно инициализировать Python из предварительной конфигурации preconfig и аргументов командной строки (строки байтов).

PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv)

Предварительно инициализировать Python из предварительной конфигурации preconfig и аргументов командной строки (широкие строки).

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

Для Конфигурации Python (PyPreConfig_InitPythonConfig()), если Python инициализируется с аргументами командной строки, аргументы командной строки также должны быть переданы для предварительной инициализации Python, так как они влияют на предварительную конфигурацию, например, кодировки. Например, опция командной строки -X utf8 включает режим UTF-8.

PyMem_SetAllocator() может быть вызван после Py_PreInitialize() и перед Py_InitializeFromConfig() для установки пользовательского аллокатора памяти. Он может быть вызван перед Py_PreInitialize(), если PyPreConfig.allocator установлено в PYMEM_ALLOCATOR_NOT_SET.

Функции выделения памяти Python, такие как PyMem_RawMalloc(), не должны использоваться до предварительной инициализации Python, в то время как прямой вызов malloc() и free() всегда безопасен. Py_DecodeLocale() не должен вызываться до предварительной инициализации.

Пример использования предварительной инициализации для включения режима UTF-8:

PyStatus status;
PyPreConfig preconfig;
PyPreConfig_InitPythonConfig(&preconfig);

preconfig.utf8_mode = 1;

status = Py_PreInitialize(&preconfig);
if (PyStatus_Exception(status)) {
    Py_ExitStatusException(status);
}

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

Py_Initialize();
/* ... use Python API here ... */
Py_Finalize();
END_OF_DOCUMENT_MARKER

PyConfig

PyConfig

Структура, содержащая большинство параметров для настройки Python.

Методы структуры:

void PyConfig_InitPythonConfig(PyConfig *config)

Инициализировать конфигурацию с помощью Конфигурации Python.

void PyConfig_InitIsolatedConfig(PyConfig *config)

Инициализировать конфигурацию с помощью Изолированной конфигурации.

PyStatus PyConfig_SetString(PyConfig *config, wchar_t * const *config_str, const wchar_t *str)

Копирует строку символов str в *config_str.

Предварительно инициализирует Python, если необходимо.

PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t * const *config_str, const char *str)

Декодирует str используя Py_DecodeLocale() и устанавливает результат в *config_str.

Предварительно инициализирует Python, если необходимо.

PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t * const *argv)

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

Предварительно инициализирует Python, если необходимо.

PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char * const *argv)

Устанавливает аргументы командной строки: декодирует байты используя Py_DecodeLocale().

Предварительно инициализирует Python, если необходимо.

PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)

Устанавливает список строк list с length и items.

Предварительно инициализирует Python, если необходимо.

PyStatus PyConfig_Read(PyConfig *config)

Считывает всю конфигурацию Python.

Поля, которые уже инициализированы, остаются без изменений.

Предварительно инициализирует Python, если необходимо.

void PyConfig_Clear(PyConfig *config)

Освобождает память конфигурации.

Большинство PyConfig методов предварительно инициализируют Python, если необходимо. В этом случае, предварительная инициализация Python основана на PyConfig. Если поля конфигурации, общие с PyPreConfig, настроены, их необходимо установить до вызова метода PyConfig:

  • dev_mode
  • isolated
  • parse_argv
  • use_environment

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

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

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

PyWideStringList argv

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

wchar_t* base_exec_prefix

sys.base_exec_prefix.

wchar_t* base_executable

sys._base_executable: __PYVENV_LAUNCHER__ значение переменной среды, или копия PyConfig.executable.

wchar_t* base_prefix

sys.base_prefix.

wchar_t* platlibdir

sys.platlibdir: имя каталога платформенной библиотеки, устанавливается во время конфигурирования --with-platlibdir, может быть переопределено переменной среды PYTHONPLATLIBDIR.

Новое в версии 3.9.

int buffered_stdio

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

stdin всегда открывается в буферизованном режиме.

int bytes_warning

Если равно 1, выдает предупреждение при сравнении bytes или bytearray с str, или сравнении bytes с int. Если равно или больше 2, вызывает исключение BytesWarning.

wchar_t* check_hash_pycs_mode

Управляет поведением проверки файлов на основе хэша .pyc (см. PEP 552): значение параметра командной строки --check-hash-based-pycs.

Допустимые значения: always, never и default.

Значение по умолчанию: default.

int configure_c_stdio

Если не равно нулю, настраивает стандартные потоки C (stdio, stdout, stdout). Например, устанавливает их режим на O_BINARY в Windows.

int dev_mode

Если не равно нулю, включает Режим разработки Python.

int dump_refs

Если не равно нулю, выгружает все объекты, которые все ещё активны при выходе.

Макрос Py_TRACE_REFS должен быть определен в сборке.

wchar_t* exec_prefix

sys.exec_prefix.

wchar_t* executable

sys.executable.

int faulthandler

Если не равно нулю, вызывает faulthandler.enable() при запуске.

wchar_t* filesystem_encoding

Кодировка файловой системы, sys.getfilesystemencoding().

wchar_t* filesystem_errors

Обработка ошибок кодировки файловой системы, sys.getfilesystemencodeerrors().

unsigned long hash_seed
int use_hash_seed

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

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

wchar_t* home

Домашний каталог Python.

По умолчанию инициализируется из значения переменной среды PYTHONHOME.

int import_time

Если не равно нулю, профилирует время импорта.

int inspect

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

int install_signal_handlers

Установить обработчики сигналов?

int interactive

Интерактивный режим.

int isolated

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

  • sys.path не содержит ни директорию скрипта (вычисленную из argv[0] или текущую директорию), ни директорию пользовательских пакетов.
  • Python REPL не импортирует readline и не включает стандартную конфигурацию readline для интерактивных запросов.
  • Установить use_environment и user_site_directory в 0.
int legacy_windows_stdio

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

Доступно только в Windows. Макрос #ifdef MS_WINDOWS может использоваться для кода, специфичного для Windows.

int malloc_stats

Если значение не равно нулю, вывести статистику по аллокатору памяти Python pymalloc при выходе.

Опция игнорируется, если Python был скомпилирован с использованием --without-pymalloc.

wchar_t* pythonpath_env

Пути поиска модулей в виде строки, разделенной DELIM (os.path.pathsep).

Инициализируется значением переменной окружения PYTHONPATH по умолчанию.

PyWideStringList module_search_paths
int module_search_paths_set

sys.path. Если module_search_paths_set равно 0, module_search_paths перезаписывается функцией, вычисляющей конфигурацию путей.

int optimization_level

Уровень оптимизации компиляции:

  • 0: Оптимизатор peephole (и __debug__ установлено в True)
  • 1: Удаление утверждений, __debug__ установлено в False
  • 2: Удаление строковых документов
int parse_argv

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

int parser_debug

Если значение не равно нулю, включить вывод отладки парсера (только для экспертов, зависит от опций компиляции).

int pathconfig_warnings

Если равно 0, подавить предупреждения при вычислении конфигурации путей (только для Unix, в Windows предупреждения не регистрируются). В противном случае предупреждения выводятся в stderr.

wchar_t* prefix

sys.prefix.

wchar_t* program_name

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

wchar_t* pycache_prefix

sys.pycache_prefix: префикс кэша .pyc.

Если NULL, sys.pycache_prefix установлено в None.

int quiet

Режим без вывода. Например, не отображать сообщения об авторских правах и версии в интерактивном режиме.

wchar_t* run_command

Аргумент python3 -c COMMAND. Используется функцией Py_RunMain().

wchar_t* run_filename

Аргумент python3 FILENAME. Используется функцией Py_RunMain().

wchar_t* run_module

Аргумент python3 -m MODULE. Используется функцией Py_RunMain().

int show_ref_count

Показать общую ссылку на счётчик при выходе?

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

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

int site_import

Импортировать модуль site при запуске?

int skip_source_first_line

Пропустить первую строку исходного кода?

wchar_t* stdio_encoding
wchar_t* stdio_errors

Кодировка и ошибки кодировки для sys.stdin, sys.stdout и sys.stderr.

int tracemalloc

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

int use_environment

Если значение больше 0, использовать переменные окружения.

int user_site_directory

Если значение не равно нулю, добавить директорию пользовательского сайта в sys.path.

int verbose

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

PyWideStringList warnoptions

sys.warnoptions: опции модуля warnings для построения фильтров предупреждений: от наименьшего к наибольшему приоритету.

Модуль warnings добавляет sys.warnoptions в обратном порядке: последнее значение PyConfig.warnoptions становится первым элементом warnings.filters, который проверяется в первую очередь (наивысший приоритет).

int write_bytecode

Если не равно нулю, записывать .pyc файлы.

sys.dont_write_bytecode инициализируется с обратным значением write_bytecode.

PyWideStringList xoptions

sys._xoptions.

int _use_peg_parser

Включить парсер PEG? По умолчанию: 1.

Устанавливается в 0 опцией командной строки -X oldparser и PYTHONOLDPARSER.

См. также PEP 617.

Устаревшее с версии 3.9, будет удалено в версии 3.10.

Если 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.

Пример установки имени программы:

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name. Implicitly preinitialize Python. */
    status = PyConfig_SetString(&config, &config.program_name,
                                L"/path/to/my_program");
    if (PyStatus_Exception(status)) {
        goto fail;
    }

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto fail;
    }
    PyConfig_Clear(&config);
    return;

fail:
    PyConfig_Clear(&config);
    Py_ExitStatusException(status);
}

Более полный пример модификации стандартной конфигурации, чтения конфигурации и последующего переопределения некоторых параметров:

PyStatus init_python(const char *program_name)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

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

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

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

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

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

    status = Py_InitializeFromConfig(&config);

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

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

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

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

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

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

PyPreConfig_InitPythonConfig() и PyConfig_InitPythonConfig() функции создают конфигурацию для создания настраиваемого Python, который ведет себя как обычный Python.

Переменные среды и аргументы командной строки используются для настройки Python, тогда как глобальные переменные конфигурации игнорируются.

Эта функция включает принуждение к локали C (PEP 538) и режим UTF-8 (PEP 540) в зависимости от локали LC_CTYPE, переменных среды PYTHONUTF8 и PYTHONCOERCECLOCALE.

Пример настраиваемого Python, всегда работающего в изолированном режиме:

int main(int argc, char **argv)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config.isolated = 1;

    /* Decode command line arguments.
       Implicitly preinitialize Python (in isolated mode). */
    status = PyConfig_SetBytesArgv(&config, argc, argv);
    if (PyStatus_Exception(status)) {
        goto fail;
    }

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

    return Py_RunMain();

fail:
    PyConfig_Clear(&config);
    if (PyStatus_IsExit(status)) {
        return status.exitcode;
    }
    /* Display the error message and exit the process with
       non-zero exit code */
    Py_ExitStatusException(status);
}
END_OF_DOCUMENT_MARKER

Настройка пути

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

  • Вводные данные для настройки пути:

    • PyConfig.home
    • PyConfig.platlibdir
    • PyConfig.pathconfig_warnings
    • PyConfig.program_name
    • PyConfig.pythonpath_env
    • текущая рабочая директория: для получения абсолютных путей
    • PATH переменная окружения для получения полного пути к программе (из PyConfig.program_name)
    • __PYVENV_LAUNCHER__ переменная окружения
    • (только Windows) Пути приложений в реестре в разделе “Software\Python\PythonCore\X.Y\PythonPath” в HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE (где X.Y — версия Python).
  • Поля вывода для настройки пути:

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

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

Можно полностью проигнорировать функцию вычисления конфигурации пути по умолчанию, явно задав все поля вывода для настройки пути, перечисленные выше. Строка считается заданной, даже если она не пустая. module_search_paths считается заданной, если module_search_paths_set установлено в 1. В этом случае поля ввода конфигурации пути также игнорируются.

Установите pathconfig_warnings в 0, чтобы подавить предупреждения при вычислении конфигурации пути (только Unix, Windows не регистрирует предупреждения).

Если поля base_prefix или base_exec_prefix не заданы, они наследуют своё значение из prefix и exec_prefix соответственно.

Py_RunMain() и Py_Main() изменяют sys.path:

  • Если run_filename задано и является директорией, которая содержит скрипт __main__.py, добавить run_filename в начало sys.path.
  • Если isolated равно нулю:

    • Если run_module задано, добавить текущую директорию в начало sys.path. Ничего не делать, если текущую директорию нельзя прочитать.
    • Если run_filename задано, добавить директорию файла в начало sys.path.
    • В противном случае, добавить пустую строку в начало sys.path.

Если site_import не равно нулю, sys.path может быть изменён модулем site. Если user_site_directory не равно нулю и директория пользовательского site-пакета существует, модуль site добавляет директорию пользовательского site-пакета в sys.path.

Следующие файлы конфигурации используются в настройке пути:

  • pyvenv.cfg
  • python._pth (только Windows)
  • pybuilddir.txt (только Unix)

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

Py_RunMain()

int Py_RunMain(void)

Выполнить команду (PyConfig.run_command), скрипт (PyConfig.run_filename) или модуль (PyConfig.run_module), указанные в командной строке или в конфигурации.

По умолчанию и когда используется опция -i, запустить REPL.

Наконец, завершает Python и возвращает код завершения, который можно передать функции exit().

См. Настройка Python для примера настраиваемого Python, всегда работающего в изолированном режиме с помощью Py_RunMain().

Py_GetArgcArgv()

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

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

API предварительной частной версии многофазной инициализации

Этот раздел представляет собой частный предварительный API, вводящий многофазную инициализацию, основную функцию PEP 432:

  • Фаза «ядра» инициализации, «минимальный Python»:

    • Встроенные типы;
    • Встроенные исключения;
    • Встроенные и замороженные модули;
    • Модуль sys инициализирован только частично (например, sys.path еще не существует).
  • Фаза инициализации «главное», Python полностью инициализирован:

    • Установить и настроить importlib;
    • Применить Настройка пути;
    • Установить обработчики сигналов;
    • Завершить инициализацию модуля sys (например, создать sys.stdout и sys.path);
    • Включить дополнительные функции, такие как faulthandler и tracemalloc;
    • Импортировать модуль site;
    • и т.д.

Частный предварительный API:

  • PyConfig._init_main: если установлено в 0, Py_InitializeFromConfig() останавливается на фазе инициализации «ядро».
  • PyConfig._isolated_interpreter: если не равно нулю, запрещает потоки, подпроцессы и fork.
PyStatus _Py_InitializeMain(void)

Переход к фазе инициализации «главное», завершение инициализации Python.

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

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

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

Пример работы кода Python между фазами инициализации «ядро» и «главное»:

void init_python(void)
{
    PyStatus status;

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

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

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

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

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

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

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

Spec-Zone.ru

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