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

---

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

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

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

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

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

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

## 30.6.2. Функции

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

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

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

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

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

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

#### `importlib.invalidate_caches()`

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

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

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

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

Иерархия ABC:

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

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

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

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

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

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

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

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

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

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

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

#### `invalidate_caches()`

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

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

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

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

#### `find_loader(fullname)`

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

#### `find_module(fullname)`

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

#### `invalidate_caches()`

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

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

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

#### `load_module(fullname)`

An abstract method for loading a module. If the module cannot be loaded, [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError) is raised, otherwise the loaded module is returned.

If the requested module already exists in [`sys.modules`](https://python-all.ru/3.3/library/sys.html#sys.modules), that module should be used and reloaded. Otherwise the loader should create a new module and insert it into [`sys.modules`](https://python-all.ru/3.3/library/sys.html#sys.modules) before any loading begins, to prevent recursion from the import. If the loader inserted a module and the load fails, it must be removed by the loader from [`sys.modules`](https://python-all.ru/3.3/library/sys.html#sys.modules); modules already in [`sys.modules`](https://python-all.ru/3.3/library/sys.html#sys.modules) before the loader began execution should be left alone. The [`importlib.util.module_for_loader()`](https://python-all.ru/3.3/library/importlib.html#importlib.util.module_for_loader) decorator handles all of these details.

The loader should set several attributes on the module. (Note that some of these attributes can change when a module is reloaded.)

- **`__name__`**

  Имя модуля.
- **`__file__`**

  Путь к месту хранения данных модуля (не задан для встроенных модулей).
- **`__cached__`**

  Путь к месту, где хранится или должна храниться скомпилированная версия модуля (не задан, если атрибут неуместен).
- **`__path__`**

  Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.
- **`__package__`**

  The parent package for the module/package. If the module is top-level then it has a value of the empty string. The [`importlib.util.set_package()`](https://python-all.ru/3.3/library/importlib.html#importlib.util.set_package) decorator can handle the details for `__package__`.
- **`__loader__`**

  The loader used to load the module. (This is not set by the built-in import machinery, but it should be set whenever a [*loader*](https://python-all.ru/3.3/glossary.html#term-loader) is used.)

#### `module_repr(module)`

An abstract method which when implemented calculates and returns the given module’s repr, as a string.

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

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

#### `get_data(path)`

An abstract method to return the bytes for the data located at *path*. Loaders that have a file-like storage back-end that allows storing arbitrary data can implement this abstract method to give direct access to the data stored. [`IOError`](https://python-all.ru/3.3/library/exceptions.html#IOError) is to be raised if the *path* cannot be found. The *path* is expected to be constructed using a module’s `__file__` attribute or an item from a package’s `__path__`.

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

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

#### `get_code(fullname)`

An abstract method to return the [`code`](https://python-all.ru/3.3/library/code.html#module-code) object for a module. `None` is returned if the module does not have a code object (e.g. built-in module). [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError) is raised if loader cannot find the requested module.

#### `get_source(fullname)`

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

#### `is_package(fullname)`

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

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

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

#### `get_filename(fullname)`

An abstract method that is to return the value of `__file__` for the specified module. If no path is available, [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError) is raised.

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

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

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

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

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

#### `name`

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

#### `path`

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

#### `load_module(fullname)`

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

#### `get_filename(fullname)`

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

#### `get_data(path)`

Returns the open, binary file for *path*.

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

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

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

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

Абстрактные методы, определённые в этом классе, предназначены для добавления необязательной поддержки файлов байткода. Если не реализовывать эти необязательные методы, загрузчик сможет работать только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода *и* байткода; но он не поддерживает *загрузку без исходного кода*, когда предоставляется только байткод. Файлы байткода являются оптимизацией, ускоряющей загрузку за счёт исключения этапа разбора компилятором Python, и поэтому никакой специфичный для байткода API не предоставляется.

#### `path_stats(path)`

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

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

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

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

#### `path_mtime(path)`

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

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

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

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

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

#### `get_code(fullname)`

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

#### `load_module(fullname)`

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

#### `get_source(fullname)`

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

#### `is_package(fullname)`

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

#### `class importlib.abc.PyLoader`

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

Устарело с версии 3.2: Этот класс устарел в пользу [`SourceLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.SourceLoader) и запланирован к удалению в Python 3.4. См. ниже, как создать подкласс, совместимый с Python 3.1 и выше.

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

```python
try:
    from importlib.abc import SourceLoader
except ImportError:
    from importlib.abc import PyLoader as SourceLoader

class CustomLoader(SourceLoader):
    def get_filename(self, fullname):
        """Возвращает путь к исходному файлу."""
        # Реализует ...

    def source_path(self, fullname):
        """Реализует source_path с помощью get_filename."""
        try:
            return self.get_filename(fullname)
        except ImportError:
            return None

    def is_package(self, fullname):
        """Реализовать is_package путём поиска файла __init__
        имя, возвращаемое get_filename."""
        filename = os.path.basename(self.get_filename(fullname))
        return os.path.splitext(filename)[0] == '__init__'
```

#### `source_path(fullname)`

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

#### `get_filename(fullname)`

Конкретная реализация [`importlib.abc.ExecutionLoader.get_filename()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.ExecutionLoader.get_filename), которая опирается на [`source_path()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader.source_path). Если [`source_path()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader.source_path) возвращает `None`, то возбуждается [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError).

#### `load_module(fullname)`

Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.Loader.load_module), которая загружает исходный код Python. Вся необходимая информация поступает из абстрактных методов, требуемых этим ABC. Единственное существенное предположение, которое делает этот метод, заключается в том, что при загрузке пакета `__path__` устанавливается в `[os.path.dirname(__file__)]`.

#### `get_code(fullname)`

Конкретная реализация [`importlib.abc.InspectLoader.get_code()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.InspectLoader.get_code), которая создаёт объекты кода из исходного кода Python, запрашивая исходный код (с помощью [`source_path()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader.source_path) и `get_data()`) и компилируя его с помощью встроенной функции [`compile()`](https://python-all.ru/3.3/library/functions.html#compile).

#### `get_source(fullname)`

Конкретная реализация [`importlib.abc.InspectLoader.get_source()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.InspectLoader.get_source). Использует [`importlib.abc.ResourceLoader.get_data()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.ResourceLoader.get_data) и [`source_path()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader.source_path) для получения исходного кода. Он пытается угадать кодировку исходного кода с помощью [`tokenize.detect_encoding()`](https://python-all.ru/3.3/library/tokenize.html#tokenize.detect_encoding).

#### `class importlib.abc.PyPycLoader`

Абстрактный базовый класс, наследующий от [`PyLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader). Этот ABC предназначен для помощи в создании загрузчиков, поддерживающих как исходный код Python, так и байткод.

Устарело с версии 3.2: Этот класс устарел в пользу [`SourceLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.SourceLoader) и для правильной поддержки [**PEP 3147**](https://python-all.ru/3.3/library/importlib.html). Если требуется совместимость с Python 3.1, реализуйте и [`SourceLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.SourceLoader), и [`PyLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader); инструкции о том, как это сделать, включены в документацию для [`PyLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader). Обратите внимание, что это решение не будет поддерживать загрузку без исходного кода; только загрузку исходного кода *и* байткода.

Изменено в версии 3.3: Обновлено для разбора (но не использования) нового поля размера исходного кода в файлах байткода при чтении и для корректной записи этого поля при записи.

#### `source_mtime(fullname)`

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

#### `bytecode_path(fullname)`

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

#### `get_filename(fullname)`

A concrete implementation of [`ExecutionLoader.get_filename()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.ExecutionLoader.get_filename) that relies on [`PyLoader.source_path()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader.source_path) and [`bytecode_path()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyPycLoader.bytecode_path). If `source_path()` returns a path, then that value is returned. Else if [`bytecode_path()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyPycLoader.bytecode_path) returns a path, that path will be returned. If a path is not available from both methods, [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError) is raised.

#### `write_bytecode(fullname, bytecode)`

An abstract method which has the loader write *bytecode* for future use. If the bytecode is written, return `True`. Return `False` if the bytecode could not be written. This method should not be called if [`sys.dont_write_bytecode`](https://python-all.ru/3.3/library/sys.html#sys.dont_write_bytecode) is true. The *bytecode* argument should be a bytes string or bytes array.

## 30.6.4. [`importlib.machinery`](https://python-all.ru/3.3/library/importlib.html#module-importlib.machinery) – Importers and path hooks

Этот модуль содержит различные объекты, которые помогают [`import`](https://python-all.ru/3.3/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.3/library/importlib.html#importlib.machinery.DEBUG_BYTECODE_SUFFIXES) или [`OPTIMIZED_BYTECODE_SUFFIXES`](https://python-all.ru/3.3/library/importlib.html#importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES) в зависимости от того, является ли `__debug__` истинным.

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

#### `importlib.machinery.EXTENSION_SUFFIXES`

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

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

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

Returns a combined list of strings representing all file suffixes for modules recognized by the standard import machinery. This is a helper for code which simply needs to know if a filesystem path potentially refers to a module without needing any details on the kind of module (for example, [`inspect.getmodulename()`](https://python-all.ru/3.3/library/inspect.html#inspect.getmodulename))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Class method that attempts to find a [*loader*](https://python-all.ru/3.3/glossary.html#term-loader) for the module specified by *fullname* on [`sys.path`](https://python-all.ru/3.3/library/sys.html#sys.path) or, if defined, on *path*. For each path entry that is searched, [`sys.path_importer_cache`](https://python-all.ru/3.3/library/sys.html#sys.path_importer_cache) is checked. If a non-false object is found then it is used as the [*path entry finder*](https://python-all.ru/3.3/glossary.html#term-path-entry-finder) to look for the module being searched for. If no entry is found in [`sys.path_importer_cache`](https://python-all.ru/3.3/library/sys.html#sys.path_importer_cache), then [`sys.path_hooks`](https://python-all.ru/3.3/library/sys.html#sys.path_hooks) is searched for a finder for the path entry and, if found, is stored in [`sys.path_importer_cache`](https://python-all.ru/3.3/library/sys.html#sys.path_importer_cache) along with being queried about the module. If no finder is ever found then `None` is both stored in the cache and returned.

#### `classmethod invalidate_caches()`

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

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

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

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

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

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

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

#### `path`

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

#### `find_loader(fullname)`

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

#### `invalidate_caches()`

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

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

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

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

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

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

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

#### `name`

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

#### `path`

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

#### `is_package(fullname)`

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

#### `path_stats(path)`

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

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

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

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

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

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

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

#### `name`

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

#### `path`

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

#### `is_package(fullname)`

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

#### `get_code(fullname)`

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

#### `get_source(fullname)`

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

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

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

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

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

#### `name`

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

#### `path`

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

#### `load_module(fullname)`

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

#### `is_package(fullname)`

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

#### `get_code(fullname)`

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

#### `get_source(fullname)`

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

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

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

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

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

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

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

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

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

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

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

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

Использование этого декоратора берёт на себя все детали того, какой объект модуля должен инициализировать загрузчик, как указано в [**PEP 302**](https://python-all.ru/3.3/library/importlib.html), настолько хорошо, насколько это возможно.

Изменено в версии 3.3: `__loader__` и `__package__` автоматически устанавливаются (когда это возможно).

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

> Декоратор
>
> [*декоратор*](https://python-all.ru/3.3/glossary.html#term-decorator)
>
> для метода
>
> [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader)
>
> , предназначенный для установки атрибута
>
> `__loader__`
>
> на загруженных модулях. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обёрнутого метода (т.е.
>
> `self`
>
> ) – это то, на что должен быть установлен
>
> `__loader__`
>
> .

> **Примечание**
>
> Рекомендуется использовать [`module_for_loader()`](https://python-all.ru/3.3/library/importlib.html#importlib.util.module_for_loader) вместо этого декоратора, поскольку он включает в себя эту функциональность.

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

> Декоратор [*декоратор*](https://python-all.ru/3.3/glossary.html#term-decorator) для [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader), устанавливающий атрибут `__package__` на модуле, возвращаемом загрузчиком. Если `__package__` уже установлен и имеет значение, отличное от `None`, он не будет изменён. Обратите внимание, что атрибут устанавливается на модуле, возвращаемом загрузчиком, а не на модуле, найденном в [`sys.modules`](https://python-all.ru/3.3/library/sys.html#sys.modules).
>
> Использовать этот декоратор не рекомендуется, если есть возможность установить `__package__` до импорта. При предварительной установке код модуля выполняется с установленным атрибутом и, таким образом, может быть использован глобальным кодом во время инициализации.

> **Примечание**
>
> Рекомендуется использовать [`module_for_loader()`](https://python-all.ru/3.3/library/importlib.html#importlib.util.module_for_loader) вместо этого декоратора, поскольку он включает в себя эту функциональность.
