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

---

# 31.5. [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) – Реализация [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import)

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

## 31.5.1. Введение

Пакет [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) преследует две цели. Первая – предоставить реализацию оператора [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) (и, соответственно, функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__)) на языке Python. Это даёт реализацию [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import), которая переносима на любой интерпретатор Python. Кроме того, такая реализация легче для понимания, чем реализация на другом языке программирования.

Во-вторых, компоненты, необходимые для реализации [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import), предоставлены в этом пакете, что упрощает пользователям создание собственных объектов (обобщённо называемых [*importer*](https://python-all.ru/3.4/glossary.html#term-importer)) для участия в процессе импорта.

> **См. также**
>
> **[*Оператор import*](https://python-all.ru/3.4/reference/simple_stmts.html#import)**
>
> Справочное руководство по оператору
>
> [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import)
>
> .
>
> **[Спецификация пакетов](https://python-all.ru/3.4/library/importlib.html)**
>
> Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе
>
> `None`
>
> в
>
> [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules)
>
> ).
>
> **Функция [`__import__()`](https://python-all.ru/3.4/library/importlib.html#importlib.__import__)**
>
> Оператор
>
> [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import)
>
> – это синтаксический сахар для этой функции.
>
> **[**PEP 235**](https://python-all.ru/3.4/library/importlib.html)**
>
> Импорт на платформах, нечувствительных к регистру
>
> **[**PEP 263**](https://python-all.ru/3.4/library/importlib.html)**
>
> Определение кодировок исходного кода Python
>
> **[**PEP 302**](https://python-all.ru/3.4/library/importlib.html)**
>
> Новые хуки импорта
>
> **[**PEP 328**](https://python-all.ru/3.4/library/importlib.html)**
>
> Импорт: многострочный и абсолютный/относительный
>
> **[**PEP 366**](https://python-all.ru/3.4/library/importlib.html)**
>
> Явные относительные импорты в главном модуле
>
> **[**PEP 451**](https://python-all.ru/3.4/library/importlib.html)**
>
> Тип ModuleSpec для системы импорта
>
> **[**PEP 3120**](https://python-all.ru/3.4/library/importlib.html)**
>
> Использование UTF-8 в качестве кодировки исходного кода по умолчанию
>
> **[**PEP 3147**](https://python-all.ru/3.4/library/importlib.html)**
>
> Каталоги репозитория PYC

## 31.5.2. Функции

#### `importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)`

Реализация встроенной функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__).

#### `importlib.import_module(name, package=None)`

Импортирует модуль. Аргумент *name* задаёт импортируемый модуль в абсолютном или относительном виде (например, `pkg.mod` или `..mod`). Если имя указано в относительной форме, то аргумент *package* должен быть задан как имя пакета, который будет служить точкой привязки для разрешения имени пакета (например, `import_module('..mod', 'pkg.subpkg')` импортирует `pkg.mod`).

Функция [`import_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.import_module) является упрощающей обёрткой вокруг [`importlib.__import__()`](https://python-all.ru/3.4/library/importlib.html#importlib.__import__). Это означает, что вся семантика функции наследуется от [`importlib.__import__()`](https://python-all.ru/3.4/library/importlib.html#importlib.__import__), включая требование, чтобы пакет, из которого происходит импорт, был ранее импортирован (т.е. *package* уже должен быть импортирован). Наиболее важное отличие состоит в том, что [`import_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.import_module) возвращает указанный пакет или модуль (например, `pkg.mod`), тогда как [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) возвращает пакет или модуль верхнего уровня (например, `pkg`).

Изменено в версии 3.3: Родительские пакеты импортируются автоматически.

#### `importlib.find_loader(name, path=None)`

Находит загрузчик для модуля, опционально в указанном *path*. Если модуль находится в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то возвращается `sys.modules[name].__loader__` (если только загрузчик не равен `None` или не установлен; в этом случае возбуждается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError)). В противном случае выполняется поиск по [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path). Если загрузчик не найден, возвращается `None`.

Для точечного имени родительские пакеты не импортируются неявно, поскольку это требует их загрузки, что может быть нежелательно. Чтобы правильно импортировать подмодуль, необходимо импортировать все родительские пакеты подмодуля и использовать правильный аргумент *path*.

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

Изменено в версии 3.4: Если `__loader__` не установлен, возбуждается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), как и в случае, когда атрибут равен `None`.

Устарело с версии 3.4: Используйте [`importlib.util.find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.find_spec) вместо этого.

#### `importlib.invalidate_caches()`

Сбрасывает внутренние кеши finder'ов, хранящиеся в [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path). Если finder реализует `invalidate_caches()`, то он будет вызван для выполнения сброса. Эту функцию следует вызывать, если во время работы программы создаются или устанавливаются модули, чтобы гарантировать, что все finder'ы заметят существование нового модуля.

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

#### `importlib.reload(module)`

Перезагружает ранее импортированный модуль *module*. Аргумент должен быть объектом модуля, то есть он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python. Возвращаемое значение – объект модуля (он может отличаться, если повторный импорт помещает другой объект в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules)).

При выполнении [`reload()`](https://python-all.ru/3.4/library/importlib.html#importlib.reload):

- Код модуля Python перекомпилируется, а код уровня модуля выполняется заново, что приводит к определению нового набора объектов, которые связываются с именами в словаре модуля путём повторного использования [*loader*](https://python-all.ru/3.4/glossary.html#term-loader), который изначально загрузил модуль. Функция `init` модулей расширения не вызывается повторно.
- Как и все другие объекты в Python, старые объекты освобождаются только после того, как счётчики ссылок на них упадут до нуля.
- Имена в пространстве имён модуля обновляются, чтобы указывать на новые или изменённые объекты.
- Другие ссылки на старые объекты (например, имена вне модуля) не перепривязываются для указания на новые объекты и должны быть обновлены в каждом пространстве имён, где они встречаются, если это необходимо.

Существует ряд других предостережений:

Когда модуль перезагружается, его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имён заменят старые определения, так что это обычно не проблема. Если новая версия модуля не определяет имя, которое было определено старой версией, старое определение остаётся. Эту возможность можно использовать в интересах модуля, если он поддерживает глобальную таблицу или кеш объектов – с помощью оператора [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try) можно проверить наличие таблицы и пропустить её инициализацию, если это необходимо:

```python
try:
    cache
except NameError:
    cache = {}
```

Обычно не имеет смысла перезагружать встроенные или динамически загружаемые модули. Перезагрузка [`sys`](https://python-all.ru/3.4/library/sys.html#module-sys), [`__main__`](https://python-all.ru/3.4/library/__main__.html#module-__main__), [`builtins`](https://python-all.ru/3.4/library/builtins.html#module-builtins) и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не рассчитаны на инициализацию более одного раза и при перезагрузке могут работать непредсказуемо.

Если модуль импортирует объекты из другого модуля с помощью [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from) ... [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) ..., вызов [`reload()`](https://python-all.ru/3.4/library/importlib.html#importlib.reload) для другого модуля не переопределяет импортированные из него объекты. Один из способов обойти это – повторно выполнить оператор [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from), другой – использовать [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) и полные имена (*module.name*).

Если модуль создаёт экземпляры класса, перезагрузка модуля, в котором определён класс, не влияет на определения методов этих экземпляров – они продолжают использовать старое определение класса. То же самое верно и для производных классов.

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

## 31.5.3. [`importlib.abc`](https://python-all.ru/3.4/library/importlib.html#module-importlib.abc) – Абстрактные базовые классы, связанные с импортом

Модуль [`importlib.abc`](https://python-all.ru/3.4/library/importlib.html#module-importlib.abc) содержит все основные абстрактные базовые классы, используемые [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import). Также предоставляются некоторые подклассы основных абстрактных базовых классов для помощи в реализации базовых ABC.

Иерархия ABC:

```python
object
 +-- Finder (deprecated)
 |    +-- MetaPathFinder
 |    +-- PathEntryFinder
 +-- Loader
      +-- ResourceLoader --------+
      +-- InspectLoader          |
           +-- ExecutionLoader --+
                                 +-- FileLoader
                                 +-- SourceLoader
```

#### `class importlib.abc.Finder`

Абстрактный базовый класс, представляющий [*искатель*](https://python-all.ru/3.4/glossary.html#term-finder).

Устарело с версии 3.3: Вместо этого используйте [`MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder) или [`PathEntryFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder).

#### `find_module(fullname, path=None)`

Абстрактный метод для поиска [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader) для указанного модуля. Изначально описан в [**PEP 302**](https://python-all.ru/3.4/library/importlib.html), этот метод предназначался для использования в [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path) и в подсистеме импорта на основе путей.

Изменено в версии 3.4: Возвращает `None` при вызове вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

#### `class importlib.abc.MetaPathFinder`

Абстрактный базовый класс, представляющий [*мета-искатель путей*](https://python-all.ru/3.4/glossary.html#term-meta-path-finder). Для совместимости это подкласс [`Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder).

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

#### `find_spec(fullname, path, target=None)`

Абстрактный метод для поиска [*спецификации*](https://python-all.ru/3.4/glossary.html#term-module-spec) для указанного модуля. Если это импорт верхнего уровня, *path* будет `None`. В противном случае это поиск подпакета или модуля, и *path* будет значением [`__path__`](https://python-all.ru/3.4/reference/import.html#__path__) из родительского пакета. Если спецификацию найти не удается, возвращается `None`. При передаче `target` – это объект модуля, который искатель может использовать для более обоснованного выбора, какую спецификацию вернуть.

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

#### `find_module(fullname, path)`

Устаревший метод для поиска [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader) для указанного модуля. Если это импорт верхнего уровня, *path* будет `None`. В противном случае это поиск подпакета или модуля, и *path* будет значением [`__path__`](https://python-all.ru/3.4/reference/import.html#__path__) из родительского пакета. Если загрузчик не найден, возвращается `None`.

Если [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) определён, предоставляется обратно-совместимая функциональность.

Изменено в версии 3.4: Возвращает `None` при вызове вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Можно использовать [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) для предоставления функциональности.

Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_spec).

#### `invalidate_caches()`

Необязательный метод, который при вызове должен аннулировать любой внутренний кеш, используемый искателем. Используется [`importlib.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.invalidate_caches) при аннулировании кешей всех искателей на [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path).

Изменено в версии 3.4: Возвращает `None` при вызове вместо `NotImplemented`.

#### `class importlib.abc.PathEntryFinder`

Абстрактный базовый класс, представляющий [*искатель записей пути*](https://python-all.ru/3.4/glossary.html#term-path-entry-finder). Хотя он имеет некоторое сходство с [`MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder), `PathEntryFinder` предназначен для использования только в подсистеме импорта на основе путей, предоставленной `PathFinder`. Этот ABC является подклассом [`Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder) только по соображениям совместимости.

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

#### `find_spec(fullname, target=None)`

Абстрактный метод для поиска [*спецификации*](https://python-all.ru/3.4/glossary.html#term-module-spec) для указанного модуля. Искатель будет искать модуль только в пределах [*записи пути*](https://python-all.ru/3.4/glossary.html#term-path-entry), к которой он приписан. Если спецификацию найти не удается, возвращается `None`. При передаче `target` – это объект модуля, который искатель может использовать для более обоснованного выбора, какую спецификацию вернуть.

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

#### `find_loader(fullname)`

Устаревший метод для поиска [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader) для указанного модуля. Возвращает кортеж из двух элементов `(loader, portion)`, где `portion` – это последовательность местоположений файловой системы, вносящих вклад в часть пространства имён пакета. Загрузчик может быть `None`, а `portion` указывает на вклад расположений файловой системы в пространство имён пакета. Пустой список может использоваться для `portion`, чтобы указать, что загрузчик не является частью пространства имён пакета. Если `loader` равен `None`, а `portion` – пустой список, то не было найдено ни загрузчика, ни местоположения для пространства имён пакета (т.е. не удалось найти ничего для модуля).

Если [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) определён, предоставляется обратно-совместимая функциональность.

Изменено в версии 3.4: Возвращает `(None, [])` вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Использует [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec), если доступен, для предоставления функциональности.

Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).

#### `find_module(fullname)`

Конкретная реализация [`Finder.find_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder.find_module), которая эквивалентна `self.find_loader(fullname)[0]`.

Устарело с версии 3.4: вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).

#### `invalidate_caches()`

Необязательный метод, который при вызове должен сбрасывать любой внутренний кеш, используемый искателем. Используется `PathFinder.invalidate_caches()` при сбросе кешей всех кешированных искателей.

#### `class importlib.abc.Loader`

Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader). См. [**PEP 302**](https://python-all.ru/3.4/library/importlib.html) для точного определения загрузчика.

#### `create_module(spec)`

Необязательный метод, возвращающий объект модуля для использования при импорте модуля. create\_module() также может вернуть `None`, что означает, что вместо этого должно использоваться создание модуля по умолчанию.

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

#### `exec_module(module)`

Абстрактный метод, который выполняет модуль в его собственном пространстве имён при импорте или перезагрузке модуля. Модуль должен уже быть инициализирован к моменту вызова exec\_module().

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

#### `load_module(fullname)`

Устаревший метод для загрузки модуля. Если модуль не может быть загружен, вызывается [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), в противном случае возвращается загруженный модуль.

Если запрошенный модуль уже существует в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), этот модуль следует использовать и перезагрузить. В противном случае загрузчик должен создать новый модуль и вставить его в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules) до начала загрузки, чтобы предотвратить рекурсию при импорте. Если загрузчик вставил модуль и загрузка не удалась, он должен быть удален загрузчиком из [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules); модули, уже находившиеся в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules) до начала выполнения загрузчика, следует оставить без изменений (см. [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader)).

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

- **[`__name__`](https://python-all.ru/3.4/reference/import.html#__name__)**

  Имя модуля.
- **[`__file__`](https://python-all.ru/3.4/reference/import.html#__file__)**

  Путь к месту хранения данных модуля (не задан для встроенных модулей).
- **[`__cached__`](https://python-all.ru/3.4/reference/import.html#__cached__)**

  Путь к месту, где хранится или должна храниться скомпилированная версия модуля (не задан, если атрибут неуместен).
- **[`__path__`](https://python-all.ru/3.4/reference/import.html#__path__)**

  Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.
- **[`__package__`](https://python-all.ru/3.4/reference/import.html#__package__)**

  Родительский пакет для модуля/пакета. Если модуль верхнего уровня, то значение – пустая строка. Декоратор

  [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader)

  может обрабатывать детали для

  [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__)

  .
- **[`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__)**

  Загрузчик, используемый для загрузки модуля. Декоратор

  [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader)

  может обрабатывать детали для

  [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__)

  .

Когда [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module) доступен, предоставляется обратно совместимая функциональность.

Изменено в версии 3.4: При вызове теперь вызывает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Функциональность предоставляется, когда доступен [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module).

Устарело с версии 3.4: Рекомендуемый API для загрузки модуля – [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module) (и опционально [`create_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.create_module)). Загрузчики должны реализовывать его вместо load\_module(). Механизм импорта берет на себя все остальные обязанности load\_module(), когда реализован exec\_module().

#### `module_repr(module)`

Устаревший метод, который при реализации вычисляет и возвращает строковое представление заданного модуля в виде строки. Стандартный repr() для типа модуля будет использовать результат этого метода по необходимости.

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

Изменено в версии 3.4: Сделано необязательным вместо абстрактного метода.

Устарело с версии 3.4: Механизм импорта теперь заботится об этом автоматически.

#### `class importlib.abc.ResourceLoader`

Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.4/library/importlib.html) для загрузки произвольных ресурсов из бэкенда хранилища.

#### `get_data(path)`

Абстрактный метод, возвращающий байты данных, расположенных по *path*. Загрузчики, имеющие файлоподобное хранилище, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод для прямого доступа к сохраненным данным. Если *path* не может быть найден, должно вызываться [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Ожидается, что *path* будет построен с использованием атрибута [`__file__`](https://python-all.ru/3.4/reference/import.html#__file__) модуля или элемента из [`__path__`](https://python-all.ru/3.4/reference/import.html#__path__) пакета.

Изменено в версии 3.4: Вызывает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

#### `class importlib.abc.InspectLoader`

Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.4/library/importlib.html) для загрузчиков, которые инспектируют модули.

#### `get_code(fullname)`

Возвращает объект кода для модуля или `None`, если модуль не имеет объекта кода (как, например, для встроенного модуля). Вызывает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), если загрузчик не может найти запрошенный модуль.

> **Примечание**
>
> Хотя метод имеет реализацию по умолчанию, рекомендуется переопределить его, если это возможно для повышения производительности.

Изменено в версии 3.4: Больше не является абстрактным, предоставлена конкретная реализация.

#### `get_source(fullname)`

Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием [*универсальных символов новой строки*](https://python-all.ru/3.4/glossary.html#term-universal-newlines), преобразуя все распознаваемые разделители строк в символы `'\n'`. Возвращает `None`, если исходный код недоступен (например, для встроенного модуля). Вызывает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), если загрузчик не может найти указанный модуль.

Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

#### `is_package(fullname)`

Абстрактный метод, возвращающий истинное значение, если модуль является пакетом, и ложное в противном случае. [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) возбуждается, если [*загрузчик*](https://python-all.ru/3.4/glossary.html#term-loader) не может найти модуль.

Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

#### `source_to_code(data, path='<string>')`

Создаёт объект кода из исходного кода Python.

Аргумент *data* может быть любым типом, который поддерживает функция [`compile()`](https://python-all.ru/3.4/library/functions.html#compile) (например, строка или байты). Аргумент *path* должен быть «путём» к источнику исходного кода, который может быть абстрактным понятием (например, расположение в zip-файле).

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

#### `exec_module(module)`

Реализация метода [`Loader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module).

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

#### `load_module(fullname)`

Реализация метода [`Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module).

Устарело с версии 3.4: используйте [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.exec_module) вместо этого.

#### `class importlib.abc.ExecutionLoader`

Абстрактный базовый класс, наследующий от [`InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader), который при реализации помогает выполнять модуль как скрипт. Этот ABC представляет необязательный протокол [**PEP 302**](https://python-all.ru/3.4/library/importlib.html).

#### `get_filename(fullname)`

Абстрактный метод, который должен возвращать значение [`__file__`](https://python-all.ru/3.4/reference/import.html#__file__) для указанного модуля. Если путь недоступен, возбуждается [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError).

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

Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

#### `class importlib.abc.FileLoader(fullname, path)`

Абстрактный базовый класс, наследующий от [`ResourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader) и [`ExecutionLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader), предоставляющий конкретные реализации методов [`ResourceLoader.get_data()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader.get_data) и [`ExecutionLoader.get_filename()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader.get_filename).

Аргумент *fullname* – это полное разрешённое имя модуля, который должен обрабатывать загрузчик. Аргумент *path* – путь к файлу модуля.

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

#### `name`

Имя модуля, который может обрабатывать загрузчик.

#### `path`

Путь к файлу модуля.

#### `load_module(fullname)`

Вызывает `load_module()` родительского класса.

Устарело с версии 3.4: Используйте [`Loader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module) вместо этого.

#### `get_filename(fullname)`

Возвращает [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader.path).

#### `get_data(path)`

Читает *path* как двоичный файл и возвращает байты из него.

#### `class importlib.abc.SourceLoader`

Абстрактный базовый класс для реализации загрузки исходных (и, опционально, байт-кодовых) файлов. Этот класс наследует как от [`ResourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader), так и от [`ExecutionLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader), требуя реализации следующих методов:

- [`ResourceLoader.get_data()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader.get_data)
- **[`ExecutionLoader.get_filename()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)**

  Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.

Абстрактные методы, определенные этим классом, предназначены для добавления опциональной поддержки байт-кодовых файлов. Отсутствие реализации этих опциональных методов (или возникновение в них исключения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError)) приводит к тому, что загрузчик работает только с исходным кодом. Реализация этих методов позволяет загрузчику работать с исходными *и* байт-кодовыми файлами; она не поддерживает *безысходную* загрузку, когда предоставляется только байт-код. Байт-кодовые файлы представляют собой оптимизацию для ускорения загрузки за счет исключения этапа парсинга компилятора Python, поэтому не предоставляется никакого API, специфичного для байт-кода.

#### `path_stats(path)`

Необязательный абстрактный метод, возвращающий [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict), содержащий метаданные о указанном пути. Поддерживаемые ключи словаря:

- `'mtime'` (обязательно): целое число или число с плавающей точкой, представляющее время изменения исходного кода;
- `'size'` (необязательно): размер исходного кода в байтах.

Все остальные ключи словаря игнорируются, чтобы обеспечить возможность будущих расширений. Если путь не может быть обработан, возбуждается [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).

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

Изменено в версии 3.4: Возбуждает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

#### `path_mtime(path)`

Необязательный абстрактный метод, возвращающий время изменения указанного пути.

Устарело с версии 3.3: Этот метод устарел в пользу [`path_stats()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.path_stats). Его не обязательно реализовывать, но он всё ещё доступен для совместимости. Возбуждает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), если путь не может быть обработан.

Изменено в версии 3.4: Возбуждает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

#### `set_data(path, data)`

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

Если запись по пути не удаётся, потому что путь доступен только для чтения ([`errno.EACCES`](https://python-all.ru/3.4/library/errno.html#errno.EACCES)/[`PermissionError`](https://python-all.ru/3.4/library/exceptions.html#PermissionError)), не распространяйте исключение.

Изменено в версии 3.4: Больше не возбуждает [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError) при вызове.

#### `get_code(fullname)`

Конкретная реализация метода [`InspectLoader.get_code()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_code).

#### `exec_module(module)`

> Конкретная реализация метода
>
> [`Loader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module)
>
> .

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

#### `load_module(fullname)`

Конкретная реализация метода [`Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module).

Устарело с версии 3.4: Вместо этого используйте [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.exec_module).

#### `get_source(fullname)`

Конкретная реализация метода [`InspectLoader.get_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_source).

#### `is_package(fullname)`

Конкретная реализация метода [`InspectLoader.is_package()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.is_package). Модуль считается пакетом, если его путь к файлу (как указано в [`ExecutionLoader.get_filename()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)) является файлом с именем `__init__` после удаления расширения файла **и** имя самого модуля не заканчивается на `__init__`.

## 31.5.4. [`importlib.machinery`](https://python-all.ru/3.4/library/importlib.html#module-importlib.machinery) – Импортеры и перехватчики путей

Этот модуль содержит различные объекты, которые помогают [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) находить и загружать модули.

#### `importlib.machinery.SOURCE_SUFFIXES`

Список строк, представляющих распознаваемые расширения файлов для исходных модулей.

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

#### `importlib.machinery.DEBUG_BYTECODE_SUFFIXES`

Список строк, представляющих расширения файлов для неоптимизированных байт-код модулей.

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

#### `importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES`

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

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

#### `importlib.machinery.BYTECODE_SUFFIXES`

Список строк, представляющих распознаваемые расширения файлов для байткод-модулей. Устанавливается в [`DEBUG_BYTECODE_SUFFIXES`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.DEBUG_BYTECODE_SUFFIXES) или [`OPTIMIZED_BYTECODE_SUFFIXES`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES) в зависимости от того, является ли `__debug__` истинным.

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

#### `importlib.machinery.EXTENSION_SUFFIXES`

Список строк с распознаваемыми расширениями файлов для модулей расширений.

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

#### `importlib.machinery.all_suffixes()`

Возвращает объединённый список строк, представляющих все расширения файлов для модулей, распознаваемых стандартным механизмом импорта. Это вспомогательная функция для кода, которому нужно просто узнать, относится ли путь файловой системы потенциально к модулю, без необходимости в деталях о типе модуля (например, [`inspect.getmodulename()`](https://python-all.ru/3.4/library/inspect.html#inspect.getmodulename)).

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

#### `class importlib.machinery.BuiltinImporter`

[*Импортер*](https://python-all.ru/3.4/glossary.html#term-importer) для встроенных модулей. Все известные встроенные модули перечислены в [`sys.builtin_module_names`](https://python-all.ru/3.4/library/sys.html#sys.builtin_module_names). Этот класс реализует ABC [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader).

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

> **Примечание**
>
> Из-за ограничений C-API модулей расширения, в настоящее время BuiltinImporter не реализует `Loader.exec_module()`.

#### `class importlib.machinery.FrozenImporter`

[*Импортер*](https://python-all.ru/3.4/glossary.html#term-importer) для замороженных модулей. Этот класс реализует ABC [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader).

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

#### `class importlib.machinery.WindowsRegistryFinder`

[*Finder*](https://python-all.ru/3.4/glossary.html#term-finder) для модулей, объявленных в реестре Windows. Этот класс реализует ABC [`importlib.abc.Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder).

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

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

#### `class importlib.machinery.PathFinder`

[*Finder*](https://python-all.ru/3.4/glossary.html#term-finder) для [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path) и атрибутов `__path__` пакета. Этот класс реализует ABC [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder).

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

#### `classmethod find_spec(fullname, path=None, target=None)`

Метод класса, который пытается найти [*спецификацию*](https://python-all.ru/3.4/glossary.html#term-module-spec) для модуля, заданного *fullname*, в [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path) или, если указан, в *path*. Для каждого проверяемого элемента пути проверяется [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache). Если найден объект, не являющийся ложным, он используется как [*поисковик для элемента пути*](https://python-all.ru/3.4/glossary.html#term-path-entry-finder) для поиска модуля. Если в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache) запись не найдена, то [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) просматривается в поисках поисковика для этого элемента пути, и если он найден, сохраняется в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache), а также запрашивается о модуле. Если поисковик так и не найден, то `None` как сохраняется в кэше, так и возвращается.

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

#### `classmethod find_module(fullname, path=None)`

Устаревшая обёртка вокруг [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.PathFinder.find_spec).

Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.PathFinder.find_spec).

#### `classmethod invalidate_caches()`

Вызывает [`importlib.abc.PathEntryFinder.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.invalidate_caches) для всех поисковиков, хранящихся в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache).

Изменено в версии 3.4: Вызывает объекты в [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) с текущей рабочей директорией для `''` (т.е. пустой строкой).

#### `class importlib.machinery.FileFinder(path, *loader_details)`

Конкретная реализация [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder), которая кэширует результаты из файловой системы.

Аргумент *path* – это каталог, за поиск в котором отвечает искатель.

Аргумент *loader\_details* – это переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознает. Загрузчики должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.

Поисковик будет кэшировать содержимое каталогов по мере необходимости, выполняя вызовы stat для каждого поиска модуля, чтобы убедиться, что кэш не устарел. Поскольку устаревание кэша зависит от точности информации о состоянии файловой системы, предоставляемой операционной системой, существует потенциальное состояние гонки: поиск модуля, создание нового файла и последующий поиск модуля, который представляет этот новый файл. Если операции выполняются достаточно быстро, чтобы уложиться в точность вызовов stat, то поиск модуля завершится неудачей. Чтобы этого избежать, при динамическом создании модуля обязательно вызывайте [`importlib.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.invalidate_caches).

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

#### `path`

Путь, в котором будет искать искатель.

#### `find_spec(fullname, target=None)`

Попытка найти спецификацию для обработки *fullname* в [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FileFinder.path).

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

#### `find_loader(fullname)`

Попытка найти загрузчик для обработки *fullname* в [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FileFinder.path).

#### `invalidate_caches()`

Очищает внутренний кеш.

#### `classmethod path_hook(*loader_details)`

Метод класса, который возвращает замыкание для использования в [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks). Замыкание возвращает экземпляр [`FileFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FileFinder), используя аргумент path, переданный замыканию напрямую, и *loader\_details* косвенно.

Если аргумент замыкания не является существующим каталогом, возникает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError).

#### `class importlib.machinery.SourceFileLoader(fullname, path)`

Конкретная реализация [`importlib.abc.SourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader) путем наследования от [`importlib.abc.FileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader) и предоставления некоторых конкретных реализаций других методов.

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

#### `name`

Имя модуля, который будет обрабатывать этот загрузчик.

#### `path`

Путь к исходному файлу.

#### `is_package(fullname)`

Возвращает true, если [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourceFileLoader.path) указывает на пакет.

#### `path_stats(path)`

Конкретная реализация [`importlib.abc.SourceLoader.path_stats()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.path_stats).

#### `set_data(path, data)`

Конкретная реализация [`importlib.abc.SourceLoader.set_data()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.set_data).

#### `load_module(name=None)`

Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.

#### `class importlib.machinery.SourcelessFileLoader(fullname, path)`

Конкретная реализация [`importlib.abc.FileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader), которая может импортировать файлы байт-кода (т.е. файлы исходного кода отсутствуют).

Обратите внимание, что прямое использование файлов байт-кода (а не файлов исходного кода) препятствует тому, чтобы ваши модули могли использоваться всеми реализациями Python или новыми версиями Python, изменяющими формат байт-кода.

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

#### `name`

Имя модуля, который будет обрабатывать загрузчик.

#### `path`

Путь к файлу байт-кода.

#### `is_package(fullname)`

Определяет, является ли модуль пакетом, на основе [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).

#### `get_code(fullname)`

Возвращает объект кода для [`name`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourcelessFileLoader.name), созданный из [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).

#### `get_source(fullname)`

Возвращает `None`, поскольку при использовании этого загрузчика файлы байт-кода не имеют исходного кода.

#### `load_module(name=None)`

Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.

#### `class importlib.machinery.ExtensionFileLoader(fullname, path)`

Конкретная реализация [`importlib.abc.ExecutionLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader) для модулей расширения.

Аргумент *fullname* задаёт имя модуля, который должен поддерживать загрузчик. Аргумент *path* – это путь к файлу модуля-расширения.

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

#### `name`

Имя модуля, который поддерживает загрузчик.

#### `path`

Путь к модулю-расширению.

#### `load_module(name=None)`

Загружает модуль расширения только в том случае, если *fullname* совпадает с [`name`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.ExtensionFileLoader.name) или является `None`.

> **Примечание**
>
> Из-за ограничений C-API модулей расширения на данный момент ExtensionFileLoader не реализует `Loader.exec_module()`.

#### `is_package(fullname)`

Возвращает `True`, если путь к файлу указывает на модуль `__init__` пакета на основе [`EXTENSION_SUFFIXES`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.EXTENSION_SUFFIXES).

#### `get_code(fullname)`

Возвращает `None`, поскольку у модулей расширения нет объекта кода.

#### `get_source(fullname)`

Возвращает `None`, поскольку модули-расширения не имеют исходного кода.

#### `get_filename(fullname)`

Возвращает [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.ExtensionFileLoader.path).

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

#### `class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)`

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

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

#### `name`

(`__name__`)

Строка с полным именем модуля.

#### `loader`

(`__loader__`)

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

#### `origin`

(`__file__`)

Имя места, из которого загружается модуль, например «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно «origin» следует задавать, но оно может быть None (по умолчанию), что означает, что оно не указано.

#### `submodule_search_locations`

(`__path__`)

Список строк, указывающих, где искать подмодули, если это пакет (в противном случае None).

#### `loader_state`

Контейнер дополнительных данных, специфичных для модуля, используемых во время загрузки (или None).

#### `cached`

(`__cached__`)

Строка, указывающая, где должен храниться скомпилированный модуль (или None).

#### `parent`

(`__package__`)

(Только для чтения) Полное имя пакета, которому модуль принадлежит как подмодуль (или None).

#### `has_location`

Логическое значение, указывающее, относится ли атрибут «origin» модуля к загружаемому расположению.

## 31.5.5. [`importlib.util`](https://python-all.ru/3.4/library/importlib.html#module-importlib.util) – Вспомогательный код для импортеров

Этот модуль содержит различные объекты, помогающие в создании [*импортёра*](https://python-all.ru/3.4/glossary.html#term-importer).

#### `importlib.util.MAGIC_NUMBER`

Байты, представляющие номер версии байткода. Если вам нужна помощь с загрузкой или записью байткода, воспользуйтесь [`importlib.abc.SourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader).

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

#### `importlib.util.cache_from_source(path, debug_override=None)`

Возвращает путь по стандарту [**PEP 3147**](https://python-all.ru/3.4/library/importlib.html) к файлу скомпилированного байткода, связанному с исходным файлом *path*. Например, если *path* равен `/foo/bar/baz.py`, то для Python 3.2 возвращаемое значение будет равно `/foo/bar/__pycache__/baz.cpython-32.pyc`. Строка `cpython-32` берётся из текущего магического тега (см. `get_tag()`; если `sys.implementation.cache_tag` не определён, будет возбуждено [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError)). Возвращаемый путь будет заканчиваться на `.pyc`, когда `__debug__` равно `True`, или на `.pyo` для оптимизированного Python (т.е. когда `__debug__` равно `False`). Передав `True` или `False` в качестве *debug\_override*, можно переопределить системное значение `__debug__` для выбора расширения.

*path* не обязан существовать.

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

#### `importlib.util.source_from_cache(path)`

По заданному пути *path* к имени файла в формате [**PEP 3147**](https://python-all.ru/3.4/library/importlib.html) возвращает путь к соответствующему исходному файлу. Например, если *path* равен `/foo/bar/__pycache__/baz.cpython-32.pyc`, возвращаемый путь будет `/foo/bar/baz.py`. *path* может не существовать, однако если он не соответствует формату [**PEP 3147**](https://python-all.ru/3.4/library/importlib.html), возбуждается `ValueError`. Если `sys.implementation.cache_tag` не определён, возбуждается [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).

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

#### `importlib.util.decode_source(source_bytes)`

Декодирует переданные байты, представляющие исходный код, и возвращает его в виде строки с универсальными символами новой строки (как требуется [`importlib.abc.InspectLoader.get_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_source)).

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

#### `importlib.util.resolve_name(name, package)`

Преобразует относительное имя модуля в абсолютное.

Если **name** не содержит начальных точек, то просто возвращается **name**. Это позволяет использовать, например, `importlib.util.resolve_name('sys', __package__)` без проверки того,\\нуказан ли аргумент **package**.

[`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) возникает, если **name** является относительным именем модуля, но package имеет ложное значение (например, `None` или пустая строка). [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) также возникает, если относительное имя выходит за пределы содержащего пакета (например, запрос `..bacon` из пакета `spam`).

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

#### `importlib.util.find_spec(name, package=None)`

Находит [*спецификацию*](https://python-all.ru/3.4/glossary.html#term-module-spec) для модуля, возможно, относительно указанного имени **package**. Если модуль уже есть в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то возвращается `sys.modules[name].__spec__` (если только спецификация не `None` или не задана, и в этом случае вызывается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError)). В противном случае выполняется поиск с помощью [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path). `None` возвращается, если спецификация не найдена.

Если **name** относится к подмодулю (содержит точку), родительский модуль импортируется автоматически.

**name** и **package** работают так же, как для `import_module()`.

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

#### `@importlib.util.module_for_loader`

[*Декоратор*](https://python-all.ru/3.4/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), предназначенный для выбора подходящего объекта модуля для загрузки. Декорированный метод должен иметь сигнатуру вызова с двумя позиционными аргументами (например, `load_module(self, module)`), где второй аргумент будет модулем **object**, используемым загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами, так как предполагается наличие двух аргументов.

Декорированный метод будет принимать **name** загружаемого модуля, как и ожидается для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader). Если модуль не найден в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то создаётся новый. Независимо от того, откуда взялся модуль, [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) устанавливается в **self**, а [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) устанавливается на основе того, что возвращает [`importlib.abc.InspectLoader.is_package()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.is_package) (если доступно). Эти атрибуты устанавливаются безусловно для поддержки перезагрузки.

Если декорированный метод вызывает исключение и модуль был добавлен в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то модуль будет удалён, чтобы предотвратить оставление частично инициализированного модуля в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules). Если модуль уже был в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то он остаётся нетронутым.

Изменено в версии 3.3: [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) и [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) теперь устанавливаются автоматически (когда это возможно).

Изменено в версии 3.4: Устанавливаются [`__name__`](https://python-all.ru/3.4/reference/import.html#__name__), [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) безусловно для поддержки перезагрузки.

Устарело с версии 3.4: Механизм импорта теперь напрямую выполняет все функции, предоставляемые этой функцией.

#### `@importlib.util.set_loader`

[*Декоратор*](https://python-all.ru/3.4/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), устанавливающий атрибут [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) на возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обёрнутого метода (т.е. `self`) и есть значение, на которое должен быть установлен [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__).

Изменено в версии 3.4: Устанавливается `__loader__`, если он установлен в `None`, как если бы атрибут не существовал.

Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.

#### `@importlib.util.set_package`

[*Декоратор*](https://python-all.ru/3.4/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), устанавливающий атрибут [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) на возвращаемом модуле. Если [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) уже установлен и имеет значение, отличное от `None`, то он не будет изменён.

Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.

#### `importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)`

Фабричная функция для создания экземпляра `ModuleSpec` на основе загрузчика. Параметры имеют тот же смысл, что и для ModuleSpec. Функция использует доступные API загрузчика [*loader*](https://python-all.ru/3.4/glossary.html#term-loader), такие как `InspectLoader.is_package()`, для заполнения любой отсутствующей информации в спецификации.

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

#### `importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)`

Фабричная функция для создания экземпляра `ModuleSpec` на основе пути к файлу. Недостающая информация будет заполнена в спецификации с использованием API загрузчика и предположения, что модуль основан на файле.

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