> **Источник:** https://python-all.ru/2.6/c-api/import.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Импорт модулей

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_ImportModule`(const char *\*name*)**

*Возвращаемое значение: новая ссылка.*

Это упрощённый интерфейс к [`PyImport_ImportModuleEx()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ImportModuleEx) ниже, который оставляет аргументы *globals* и *locals* равными *NULL*, а *level* – равным 0. Когда аргумент *name* содержит точку (то есть задаёт подмодуль пакета), аргумент *fromlist* устанавливается в список `['*']`, чтобы возвращаемым значением был именованный модуль, а не содержащий его пакет верхнего уровня, как было бы в противном случае. (К сожалению, это имеет дополнительный побочный эффект, когда *name* на самом деле задаёт подпакет, а не подмодуль: подмодули, указанные в переменной `__all__` пакета, загружаются.) Возвращает новую ссылку на импортированный модуль или *NULL* с установленным исключением при неудаче. До Python 2.4 модуль мог быть создан даже в случае неудачи – проверьте `sys.modules`, чтобы узнать. Начиная с Python 2.4, неудачный импорт модуля больше не оставляет модуль в `sys.modules`.

Изменено в версии 2.4: Неудачные импорты удаляют незавершённые объекты модуля.

Изменено в версии 2.6: Всегда использует абсолютные импорты.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_ImportModuleNoBlock`(const char *\*name*)**

Эта версия [`PyImport_ImportModule()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ImportModule) не блокирует. Она предназначена dля использования в функциях C, которые импортируют другие модули для выполнения функции. Импорт может блокироваться, если другой поток удерживает блокировку импорта. Функция [`PyImport_ImportModuleNoBlock()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ImportModuleNoBlock) никогда не блокируется. Она сначала пытается получить модуль из sys.modules, а в случае неудачи обращается к [`PyImport_ImportModule()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ImportModule) если только блокировка не удерживается. В последнем случае функция возбуждает исключение [`ImportError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.ImportError).

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

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_ImportModuleEx`(char *\*name*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*globals*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*locals*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*fromlist*)**

*Возвращаемое значение: новая ссылка.*

Импортирует модуль. Лучше всего это описывается встроенной функцией Python [`__import__()`](https://python-all.ru/2.6/library/functions.html#__import__), поскольку стандартная функция [`__import__()`](https://python-all.ru/2.6/library/functions.html#__import__) напрямую вызывает эту функцию.

Возвращаемое значение – это новая ссылка на импортированный модуль или пакет верхнего уровня, или *NULL* с установленным исключением при неудаче (до Python 2.4 модуль мог всё ещё быть создан в этом случае). Как и для [`__import__()`](https://python-all.ru/2.6/library/functions.html#__import__), возвращаемое значение при запросе подмодуля пакета обычно является пакетом верхнего уровня, если только не был указан непустой *fromlist*.

Изменено в версии 2.4: Неудачные импорты удаляют незавершённые объекты модуля.

Изменено в версии 2.6: Функция является псевдонимом для [`PyImport_ImportModuleLevel()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ImportModuleLevel) с уровнем -1, что означает относительный импорт.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_ImportModuleLevel`(char *\*name*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*globals*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*locals*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*fromlist*, int *level*)**

*Возвращаемое значение: новая ссылка.*

Импортирует модуль. Лучше всего это описывается встроенной функцией Python [`__import__()`](https://python-all.ru/2.6/library/functions.html#__import__), поскольку стандартная функция [`__import__()`](https://python-all.ru/2.6/library/functions.html#__import__) напрямую вызывает эту функцию.

Возвращаемое значение – новая ссылка на импортированный модуль или пакет верхнего уровня, или *NULL* с установленным исключением в случае ошибки. Как и для [`__import__()`](https://python-all.ru/2.6/library/functions.html#__import__), возвращаемое значение при запросе подмодуля пакета обычно является пакетом верхнего уровня, если только не был передан непустой *fromlist*.

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

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_Import`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*name*)**

*Возвращаемое значение: новая ссылка.*

Это интерфейс более высокого уровня, который вызывает текущую «функцию перехвата импорта». Он вызывает функцию [`__import__()`](https://python-all.ru/2.6/library/functions.html#__import__) из `__builtins__` текущих глобалов. Это означает, что импорт выполняется с использованием любых перехватчиков импорта, установленных в текущем окружении, например, [`rexec`](https://python-all.ru/2.6/library/rexec.html#module-rexec) или `ihooks`.

Изменено в версии 2.6: Всегда использует абсолютные импорты.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_ReloadModule`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*m*)**

*Возвращаемое значение: новая ссылка.*

Перезагрузка модуля. Лучше всего это описывается ссылкой на встроенную функцию Python [`reload()`](https://python-all.ru/2.6/library/functions.html#reload), поскольку стандартная функция [`reload()`](https://python-all.ru/2.6/library/functions.html#reload) напрямую вызывает эту функцию. Возвращает новую ссылку на перезагруженный модуль или *NULL* с установленным исключением при неудаче (модуль всё ещё существует в этом случае).

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_AddModule`(const char *\*name*)**

*Возвращаемое значение: заимствованная ссылка.*

Возвращает объект модуля, соответствующий имени модуля. Аргумент *name* может иметь вид `package.module`. Сначала проверяется словарь модулей, есть ли там такой модуль; если нет, создаётся новый и вставляется в словарь модулей. Возвращает *NULL* с установленным исключением в случае ошибки.

> **Примечание**
>
> Эта функция не загружает и не импортирует модуль; если модуль ещё не был загружен, будет получен пустой объект модуля. Используйте [`PyImport_ImportModule()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ImportModule) или один из его вариантов для импорта модуля. Структуры пакетов, подразумеваемые составным именем для *name*, не создаются, если их ещё нет.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_ExecCodeModule`(char *\*name*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*co*)**

*Возвращаемое значение: новая ссылка.*

Принимая имя модуля (возможно, вида `package.module`) и объект кода, прочитанный из файла байт-кода Python или полученный из встроенной функции [`compile()`](https://python-all.ru/2.6/library/functions.html#compile), загружает модуль. Возвращает новую ссылку на объект модуля или *NULL* с установленным исключением, если произошла ошибка. До Python 2.4 модуль мог быть создан даже в случае ошибки. Начиная с Python 2.4, *name* удаляется из [`sys.modules`](https://python-all.ru/2.6/library/sys.html#sys.modules) в случае ошибки, даже если *name* уже находился в [`sys.modules`](https://python-all.ru/2.6/library/sys.html#sys.modules) на момент вызова [`PyImport_ExecCodeModule()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ExecCodeModule). Оставлять неполностью инициализированные модули в [`sys.modules`](https://python-all.ru/2.6/library/sys.html#sys.modules) опасно, так как импорты таких модулей не могут узнать, что объект модуля находится в неизвестном (и, вероятно, повреждённом относительно замыслов автора модуля) состоянии.

Атрибут `__file__` модуля будет установлен в `co_filename` объекта кода.

Эта функция перезагрузит модуль, если он уже был импортирован. См. [`PyImport_ReloadModule()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ReloadModule) – это предназначенный способ перезагрузки модуля.

Если *name* указывает на составное имя вида `package.module`, любые структуры пакетов, которые ещё не были созданы, по-прежнему не будут созданы.

Изменено в версии 2.4: *name* удаляется из [`sys.modules`](https://python-all.ru/2.6/library/sys.html#sys.modules) в случае ошибок.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_ExecCodeModuleEx`(char *\*name*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*co*, char *\*pathname*)**

*Возвращаемое значение: новая ссылка.*

Как и [`PyImport_ExecCodeModule()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ExecCodeModule), но атрибут `__file__` объекта модуля устанавливается в *pathname*, если он не равен `NULL`.

**long `PyImport_GetMagicNumber`()**

Возвращает магическое число для файлов байт-кода Python (также известных как файлы

`.pyc`

и

`.pyo`

). Магическое число должно находиться в первых четырёх байтах файла байт-кода в порядке little-endian.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_GetModuleDict`()**

*Возвращаемое значение: заимствованная ссылка.*

Возвращает словарь, используемый для управления модулями (также известный как `sys.modules`). Обратите внимание, что это переменная на интерпретатор.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyImport_GetImporter`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*path*)**

Возвращает объект импортёра для элемента [`sys.path`](https://python-all.ru/2.6/library/sys.html#sys.path)/`pkg.__path__` *path*, возможно получая его из словаря [`sys.path_importer_cache`](https://python-all.ru/2.6/library/sys.html#sys.path_importer_cache). Если он ещё не кэширован, проходит по [`sys.path_hooks`](https://python-all.ru/2.6/library/sys.html#sys.path_hooks), пока не будет найден хук, способный обработать данный элемент пути. Возвращает `None`, если ни один хук не подошёл; это сообщает вызывающему коду, что следует вернуться к встроенному механизму импорта. Кэширует результат в [`sys.path_importer_cache`](https://python-all.ru/2.6/library/sys.html#sys.path_importer_cache). Возвращает новую ссылку на объект импортёра.

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

**void `_PyImport_Init`()**

Инициализирует механизм импорта. Только для внутреннего использования.

**void `PyImport_Cleanup`()**

Очищает таблицу модулей. Только для внутреннего использования.

**void `_PyImport_Fini`()**

Завершает работу механизма импорта. Только для внутреннего использования.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `_PyImport_FindExtension`(char *\**, char *\**)**

Только для внутреннего использования.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `_PyImport_FixupExtension`(char *\**, char *\**)**

Только для внутреннего использования.

**int `PyImport_ImportFrozenModule`(char *\*name*)**

Загружает замороженный модуль с именем

*name*

. Возвращает

`1`

в случае успеха,

`0`

если модуль не найден и

`-1`

с установленным исключением, если инициализация не удалась. Для доступа к импортированному модулю после успешной загрузки используйте

[`PyImport_ImportModule()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ImportModule)

. (Обратите внимание на неточность в названии – эта функция перезагрузила бы модуль, если бы он уже был импортирован.)

**struct `_frozen`**

Это определение типа структуры для дескрипторов замороженных модулей, создаваемое утилитой **freeze** (см. `Tools/freeze/` в дистрибутиве исходного кода Python). Её определение находится в `Include/import.h`:

```c
struct _frozen {
    char *name;
    unsigned char *code;
    int size;
};
```

**struct [\_frozen](https://python-all.ru/2.6/c-api/import.html#_frozen)\* `PyImport_FrozenModules`**

Этот указатель инициализируется так, чтобы указывать на массив записей

`struct _frozen`

, заканчивающийся записью, все члены которой равны

*NULL*

или нулю. Когда замороженный модуль импортируется, он ищется в этой таблице. Сторонний код может использовать это для предоставления динамически созданной коллекции замороженных модулей.

**int `PyImport_AppendInittab`(char *\*name*, void *(\*initfunc)(void)*)**

Добавляет один модуль в существующую таблицу встроенных модулей. Это удобная обёртка вокруг

[`PyImport_ExtendInittab()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ExtendInittab)

, возвращающая

`-1`

, если таблицу не удалось расширить. Новый модуль может быть импортирован под именем

*name*

и использует функцию

*initfunc*

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

[`Py_Initialize()`](https://python-all.ru/2.6/c-api/init.html#Py_Initialize)

.

**struct `_inittab`**

Структура, описывающая одну запись в списке встроенных модулей. Каждая из этих структур содержит имя и функцию инициализации для модуля, встроенного в интерпретатор. Программы, встраивающие Python, могут использовать массив таких структур совместно с [`PyImport_ExtendInittab()`](https://python-all.ru/2.6/c-api/import.html#PyImport_ExtendInittab) для предоставления дополнительных встроенных модулей. Структура определена в `Include/import.h` следующим образом:

```c
struct _inittab {
    char *name;
    void (*initfunc)(void);
};
```

**int `PyImport_ExtendInittab`(struct [\_inittab](https://python-all.ru/2.6/c-api/import.html#_inittab) *\*newtab*)**

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

*newtab*

должен заканчиваться сторожевой записью, содержащей

*NULL*

в поле

`name`

; отсутствие сторожевого значения может привести к ошибке памяти. Возвращает

`0`

в случае успеха или

`-1`

, если недостаточно памяти для расширения внутренней таблицы. В случае неудачи модули не добавляются во внутреннюю таблицу. Этот вызов должен быть выполнен до

[`Py_Initialize()`](https://python-all.ru/2.6/c-api/init.html#Py_Initialize)

.
