Документация Python неофициальный перевод

import.md

169 строк · 19.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/c-api/import.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Импорт модулей89#### `PyObject* PyImport_ImportModule(const char *name)`1011*Возвращаемое значение: новая ссылка.*1213Это упрощённый интерфейс к [`PyImport_ImportModuleEx()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ImportModuleEx) (см. ниже), при этом аргументы *globals* и *locals* принимают значение *NULL*, а *level* – 0. Когда аргумент *name* содержит точку (то есть указывает на подмодуль пакета), аргумент *fromlist* устанавливается в список `['*']`, чтобы возвращаемым значением был указанный модуль, а не содержащий его пакет верхнего уровня, как было бы в противном случае. (К сожалению, у этого есть дополнительный побочный эффект, когда *name* на самом деле указывает на подпакет, а не на подмодуль: загружаются подмодули, указанные в переменной `__all__` пакета.) Возвращает новую ссылку на импортированный модуль или *NULL* с установленным исключением в случае ошибки. Неудачный импорт модуля не оставляет модуль в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules).1415Эта функция всегда использует абсолютные импорты.1617#### `PyObject* PyImport_ImportModuleNoBlock(const char *name)`1819Эта версия [`PyImport_ImportModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ImportModule) не блокирует. Она предназначена dля использования в функциях C, которые импортируют другие модули для выполнения функции. Импорт может блокироваться, если другой поток удерживает блокировку импорта. Функция [`PyImport_ImportModuleNoBlock()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ImportModuleNoBlock) никогда не блокируется. Она сначала пытается получить модуль из sys.modules, а в случае неудачи обращается к [`PyImport_ImportModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ImportModule) если только блокировка не удерживается. В последнем случае функция возбуждает исключение [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError).2021#### `PyObject* PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)`2223*Возвращаемое значение: новая ссылка.*2425Импортирует модуль. Лучше всего это описывается встроенной функцией Python [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__), поскольку стандартная функция [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__) напрямую вызывает эту функцию.2627Возвращаемое значение – новая ссылка на импортированный модуль или пакет верхнего уровня, или *NULL* с установленным исключением в случае ошибки. Как и для [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__), возвращаемое значение при запросе подмодуля пакета обычно является пакетом верхнего уровня, если только не был передан непустой *fromlist*.2829Неудачные импорты удаляют неполные объекты модулей, как и в [`PyImport_ImportModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ImportModule).3031#### `PyObject* PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)`3233*Возвращаемое значение: новая ссылка.*3435Импортирует модуль. Лучше всего это описывается встроенной функцией Python [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__), поскольку стандартная функция [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__) напрямую вызывает эту функцию.3637Возвращаемое значение – новая ссылка на импортированный модуль или пакет верхнего уровня, или *NULL* с установленным исключением в случае ошибки. Как и для [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__), возвращаемое значение при запросе подмодуля пакета обычно является пакетом верхнего уровня, если только не был передан непустой *fromlist*.3839#### `PyObject* PyImport_Import(PyObject *name)`4041*Возвращаемое значение: новая ссылка.*4243Это интерфейс более высокого уровня, который вызывает текущую «функцию перехвата импорта» (с явным *level*, равным 0, что означает абсолютный импорт). Он вызывает функцию [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__) из `__builtins__` текущих globals. Это означает, что импорт выполняется с использованием тех перехватчиков импорта, которые установлены в текущем окружении.4445Эта функция всегда использует абсолютные импорты.4647#### `PyObject* PyImport_ReloadModule(PyObject *m)`4849*Возвращаемое значение: новая ссылка.*5051Перезагружает модуль. Возвращает новую ссылку на перезагруженный модуль или *NULL* с установленным исключением в случае неудачи (в этом случае модуль всё ещё существует).5253#### `PyObject* PyImport_AddModule(const char *name)`5455*Возвращаемое значение: заимствованная ссылка.*5657Возвращает объект модуля, соответствующий имени модуля. Аргумент *name* может иметь вид `package.module`. Сначала проверяется словарь модулей, есть ли там такой модуль; если нет, создаётся новый и вставляется в словарь модулей. Возвращает *NULL* с установленным исключением в случае ошибки.5859> **Примечание**60>61> Эта функция не загружает и не импортирует модуль; если модуль ещё не был загружен, будет получен пустой объект модуля. Используйте [`PyImport_ImportModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ImportModule) или один из его вариантов для импорта модуля. Структуры пакетов, подразумеваемые составным именем для *name*, не создаются, если их ещё нет.6263#### `PyObject* PyImport_ExecCodeModule(char *name, PyObject *co)`6465*Возвращаемое значение: новая ссылка.*6667Получая имя модуля (возможно, вида `package.module`) и объект кода, прочитанный из файла байт-кода Python или полученный от встроенной функции [`compile()`](https://python-all.ru/3.2/library/functions.html#compile), загружает модуль. Возвращает новую ссылку на объект модуля или *NULL* с установленным исключением, если произошла ошибка. *name* удаляется из [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules) в случае ошибки, даже если *name* уже был в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules) на момент входа в [`PyImport_ExecCodeModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExecCodeModule). Оставлять не полностью инициализированные модули в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules) опасно, так как импорты таких модулей не могут узнать, что объект модуля находится в неизвестном (и, вероятно, повреждённом относительно замысла автора модуля) состоянии.6869Атрибут `__file__` модуля будет установлен в `co_filename` объекта кода.7071Эта функция перезагрузит модуль, если он уже был импортирован. См. [`PyImport_ReloadModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ReloadModule) – это предназначенный способ перезагрузки модуля.7273Если *name* указывает на составное имя вида `package.module`, любые структуры пакетов, которые ещё не были созданы, по-прежнему не будут созданы.7475См. также [`PyImport_ExecCodeModuleEx()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExecCodeModuleEx) и [`PyImport_ExecCodeModuleWithPathnames()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExecCodeModuleWithPathnames).7677#### `PyObject* PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)`7879*Возвращаемое значение: новая ссылка.*8081Как и [`PyImport_ExecCodeModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExecCodeModule), но атрибут `__file__` объекта модуля устанавливается в *pathname*, если он не равен `NULL`.8283См. также [`PyImport_ExecCodeModuleWithPathnames()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExecCodeModuleWithPathnames).8485#### `PyObject* PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, char *cpathname)`8687Как и [`PyImport_ExecCodeModuleEx()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExecCodeModuleEx), но атрибут `__cached__` объекта модуля устанавливается в *cpathname*, если он не равен `NULL`. Из трёх функций это предпочтительная.8889Новое в версии 3.2.9091#### `long PyImport_GetMagicNumber()`9293Возвращает магическое число для файлов байт-кода Python (также известных как файлы `.pyc` и `.pyo`). Магическое число должно находиться в первых четырёх байтах файла байт-кода в порядке little-endian.9495#### `const char * PyImport_GetMagicTag()`9697Возвращает строку магического тега для [**PEP 3147**](https://python-all.ru/3.2/c-api/import.html) файлов байт-кода Python.9899Новое в версии 3.2.100101#### `PyObject* PyImport_GetModuleDict()`102103*Возвращаемое значение: заимствованная ссылка.*104105Возвращает словарь, используемый для управления модулями (также известный как `sys.modules`). Обратите внимание, что это переменная на интерпретатор.106107#### `PyObject* PyImport_GetImporter(PyObject *path)`108109Возвращает объект импортёра для элемента [`sys.path`](https://python-all.ru/3.2/library/sys.html#sys.path)/`pkg.__path__` *path*, возможно получая его из словаря [`sys.path_importer_cache`](https://python-all.ru/3.2/library/sys.html#sys.path_importer_cache). Если он ещё не кэширован, проходит по [`sys.path_hooks`](https://python-all.ru/3.2/library/sys.html#sys.path_hooks), пока не будет найден хук, способный обработать данный элемент пути. Возвращает `None`, если ни один хук не подошёл; это сообщает вызывающему коду, что следует вернуться к встроенному механизму импорта. Кэширует результат в [`sys.path_importer_cache`](https://python-all.ru/3.2/library/sys.html#sys.path_importer_cache). Возвращает новую ссылку на объект импортёра.110111#### `void _PyImport_Init()`112113Инициализирует механизм импорта. Только для внутреннего использования.114115#### `void PyImport_Cleanup()`116117Очищает таблицу модулей. Только для внутреннего использования.118119#### `void _PyImport_Fini()`120121Завершает работу механизма импорта. Только для внутреннего использования.122123#### `PyObject* _PyImport_FindExtension(char *, char *)`124125Только для внутреннего использования.126127#### `PyObject* _PyImport_FixupExtension(char *, char *)`128129Только для внутреннего использования.130131#### `int PyImport_ImportFrozenModule(char *name)`132133Загружает замороженный модуль с именем *name*. Возвращает `1` в случае успеха, `0` если модуль не найден и `-1` с установленным исключением, если инициализация не удалась. Для доступа к импортированному модулю после успешной загрузки используйте [`PyImport_ImportModule()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ImportModule). (Обратите внимание на неточность в названии – эта функция перезагрузила бы модуль, если бы он уже был импортирован.)134135**struct `_frozen`**136137Это определение типа структуры для дескрипторов замороженных модулей, создаваемое утилитой **freeze** (см. `Tools/freeze/` в дистрибутиве исходного кода Python). Её определение находится в `Include/import.h`:138139```c140struct _frozen {141    char *name;142    unsigned char *code;143    int size;144};145```146147**struct [\_frozen](https://python-all.ru/3.2/c-api/import.html#_frozen)\* `PyImport_FrozenModules`**148149Этот указатель инициализируется так, чтобы указывать на массив записей `struct _frozen`, заканчивающийся записью, все члены которой равны *NULL* или нулю. Когда замороженный модуль импортируется, он ищется в этой таблице. Сторонний код может использовать это для предоставления динамически созданной коллекции замороженных модулей.150151#### `int PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))`152153Добавляет один модуль в существующую таблицу встроенных модулей. Это удобная обёртка вокруг [`PyImport_ExtendInittab()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExtendInittab), возвращающая `-1`, если таблицу не удалось расширить. Новый модуль может быть импортирован под именем *name* и использует функцию *initfunc* в качестве функции инициализации, вызываемой при первой попытке импорта. Это должно быть вызвано до [`Py_Initialize()`](https://python-all.ru/3.2/c-api/init.html#Py_Initialize).154155**struct `_inittab`**156157Структура, описывающая одну запись в списке встроенных модулей. Каждая из этих структур содержит имя и функцию инициализации для модуля, встроенного в интерпретатор. Программы, встраивающие Python, могут использовать массив таких структур совместно с [`PyImport_ExtendInittab()`](https://python-all.ru/3.2/c-api/import.html#PyImport_ExtendInittab) для предоставления дополнительных встроенных модулей. Структура определена в `Include/import.h` следующим образом:158159```c160struct _inittab {161    char *name;162    PyObject* (*initfunc)(void);163};164```165166#### `int PyImport_ExtendInittab(struct _inittab *newtab)`167168Добавляет набор модулей в таблицу встроенных модулей. Массив *newtab* должен заканчиваться сторожевой записью, содержащей *NULL* в поле `name`; отсутствие сторожевого значения может привести к ошибке памяти. Возвращает `0` в случае успеха или `-1`, если недостаточно памяти для расширения внутренней таблицы. В случае неудачи модули не добавляются во внутреннюю таблицу. Этот вызов должен быть выполнен до [`Py_Initialize()`](https://python-all.ru/3.2/c-api/init.html#Py_Initialize).169