importlib.md
1> **Источник:** https://python-all.ru/3.3/library/importlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 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)89Новое в версии 3.1.1011## 30.6.1. Введение1213Пакет [`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. Кроме того, такая реализация легче для понимания, чем реализация на другом языке программирования.1415Во-вторых, компоненты, необходимые для реализации [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import), предоставлены в этом пакете, что упрощает пользователям создание собственных объектов (обобщённо называемых [*importer*](https://python-all.ru/3.3/glossary.html#term-importer)) для участия в процессе импорта.1617> **См. также**18>19> **[*Оператор import*](https://python-all.ru/3.3/reference/simple_stmts.html#import)**20>21> Справочное руководство по оператору22>23> [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import)24>25> .26>27> **[Спецификация пакетов](https://python-all.ru/3.3/library/importlib.html)**28>29> Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе30>31> `None`32>33> в34>35> [`sys.modules`](https://python-all.ru/3.3/library/sys.html#sys.modules)36>37> ).38>39> **Функция [`__import__()`](https://python-all.ru/3.3/library/importlib.html#importlib.__import__)**40>41> Оператор42>43> [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import)44>45> – это синтаксический сахар для этой функции.46>47> **[**PEP 235**](https://python-all.ru/3.3/library/importlib.html)**48>49> Импорт на платформах, нечувствительных к регистру50>51> **[**PEP 263**](https://python-all.ru/3.3/library/importlib.html)**52>53> Определение кодировок исходного кода Python54>55> **[**PEP 302**](https://python-all.ru/3.3/library/importlib.html)**56>57> Новые хуки импорта58>59> **[**PEP 328**](https://python-all.ru/3.3/library/importlib.html)**60>61> Импорт: многострочный и абсолютный/относительный62>63> **[**PEP 366**](https://python-all.ru/3.3/library/importlib.html)**64>65> Явные относительные импорты в главном модуле66>67> **[**PEP 451**](https://python-all.ru/3.3/library/importlib.html)**68>69> Тип ModuleSpec для системы импорта70>71> **[**PEP 3120**](https://python-all.ru/3.3/library/importlib.html)**72>73> Использование UTF-8 в качестве кодировки исходного кода по умолчанию74>75> **[**PEP 3147**](https://python-all.ru/3.3/library/importlib.html)**76>77> Каталоги репозитория PYC7879## 30.6.2. Функции8081#### `importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)`8283Реализация встроенной функции [`__import__()`](https://python-all.ru/3.3/library/functions.html#__import__).8485#### `importlib.import_module(name, package=None)`8687Импортирует модуль. Аргумент *name* задаёт импортируемый модуль в абсолютном или относительном виде (например, `pkg.mod` или `..mod`). Если имя указано в относительной форме, то аргумент *package* должен быть задан как имя пакета, который будет служить точкой привязки для разрешения имени пакета (например, `import_module('..mod', 'pkg.subpkg')` импортирует `pkg.mod`).8889Функция [`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`).9091Изменено в версии 3.3: Родительские пакеты импортируются автоматически.9293#### `importlib.find_loader(name, path=None)`9495Находит загрузчик для модуля, возможно, в пределах указанного *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` возвращается, если загрузчик не найден.9697Для точечного имени родительские пакеты не импортируются неявно, поскольку это требует их загрузки, что может быть нежелательно. Чтобы правильно импортировать подмодуль, необходимо импортировать все родительские пакеты подмодуля и использовать правильный аргумент *path*.9899#### `importlib.invalidate_caches()`100101Сбрасывает внутренние кеши finder'ов, хранящиеся в [`sys.meta_path`](https://python-all.ru/3.3/library/sys.html#sys.meta_path). Если finder реализует `invalidate_caches()`, то он будет вызван для выполнения сброса. Эту функцию следует вызывать, если во время работы программы создаются или устанавливаются модули, чтобы гарантировать, что все finder'ы заметят существование нового модуля.102103Новое в версии 3.3.104105## 30.6.3. [`importlib.abc`](https://python-all.ru/3.3/library/importlib.html#module-importlib.abc) – Абстрактные базовые классы, связанные с импортом106107Модуль [`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.108109Иерархия ABC:110111```python112object113 +-- Finder (deprecated)114 | +-- MetaPathFinder115 | +-- PathEntryFinder116 +-- Loader117 +-- ResourceLoader --------+118 +-- InspectLoader |119 +-- ExecutionLoader --+120 +-- FileLoader121 +-- SourceLoader122 +-- PyLoader (deprecated)123 +-- PyPycLoader (deprecated)124```125126#### `class importlib.abc.Finder`127128Абстрактный базовый класс, представляющий [*искатель*](https://python-all.ru/3.3/glossary.html#term-finder).129130Устарело с версии 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).131132#### `find_module(fullname, path=None)`133134Абстрактный метод для поиска [*загрузчика*](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) и в подсистеме импорта на основе путей.135136#### `class importlib.abc.MetaPathFinder`137138Абстрактный базовый класс, представляющий [*мета-искатель путей*](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).139140Новое в версии 3.3.141142#### `find_module(fullname, path)`143144Абстрактный метод для поиска [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader) для указанного модуля. Если это импорт верхнего уровня, *path* будет `None`. В противном случае это поиск подпакета или модуля, и *path* будет значением `__path__` из родительского пакета. Если загрузчик не найден, возвращается `None`.145146#### `invalidate_caches()`147148Необязательный метод, который при вызове должен аннулировать любой внутренний кеш, используемый искателем. Используется [`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).149150#### `class importlib.abc.PathEntryFinder`151152Абстрактный базовый класс, представляющий [*искатель по элементам пути*](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) для совместимости.153154Новое в версии 3.3.155156#### `find_loader(fullname)`157158Абстрактный метод для поиска [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader) для указанного модуля. Возвращает кортеж из двух элементов `(loader, portion)`, где `portion` – последовательность местоположений в файловой системе, которые входят в часть пакета пространства имён. Загрузчик может быть `None`, при этом `portion` указывает на вклад этих местоположений в пакет пространства имён. Пустой список для `portion` означает, что загрузчик не является частью пакета. Если `loader` равен `None` и `portion` является пустым списком, то ни загрузчик, ни местоположение для пакета пространства имён не были найдены (т.е. ничего не найдено для модуля).159160#### `find_module(fullname)`161162Конкретная реализация [`Finder.find_module()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.Finder.find_module), которая эквивалентна `self.find_loader(fullname)[0]`.163164#### `invalidate_caches()`165166Необязательный метод, который при вызове должен сбрасывать любой внутренний кеш, используемый искателем. Используется `PathFinder.invalidate_caches()` при сбросе кешей всех кешированных искателей.167168#### `class importlib.abc.Loader`169170Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader). См. [**PEP 302**](https://python-all.ru/3.3/library/importlib.html) для точного определения загрузчика.171172#### `load_module(fullname)`173174An 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.175176If 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.177178The loader should set several attributes on the module. (Note that some of these attributes can change when a module is reloaded.)179180- **`__name__`**181182 Имя модуля.183- **`__file__`**184185 Путь к месту хранения данных модуля (не задан для встроенных модулей).186- **`__cached__`**187188 Путь к месту, где хранится или должна храниться скомпилированная версия модуля (не задан, если атрибут неуместен).189- **`__path__`**190191 Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.192- **`__package__`**193194 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__`.195- **`__loader__`**196197 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.)198199#### `module_repr(module)`200201An abstract method which when implemented calculates and returns the given module’s repr, as a string.202203#### `class importlib.abc.ResourceLoader`204205Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.3/library/importlib.html) для загрузки произвольных ресурсов из бэкенда хранилища.206207#### `get_data(path)`208209An 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__`.210211#### `class importlib.abc.InspectLoader`212213Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.3/library/importlib.html) для загрузчиков, которые инспектируют модули.214215#### `get_code(fullname)`216217An 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.218219#### `get_source(fullname)`220221Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием [*универсальных символов новой строки*](https://python-all.ru/3.3/glossary.html#term-universal-newlines), преобразуя все распознаваемые разделители строк в символы `'\n'`. Возвращает `None`, если исходный код недоступен (например, для встроенного модуля). Вызывает [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError), если загрузчик не может найти указанный модуль.222223#### `is_package(fullname)`224225Абстрактный метод, возвращающий истинное значение, если модуль является пакетом, и ложное в противном случае. [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError) возбуждается, если [*загрузчик*](https://python-all.ru/3.3/glossary.html#term-loader) не может найти модуль.226227#### `class importlib.abc.ExecutionLoader`228229Абстрактный базовый класс, наследующий от [`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).230231#### `get_filename(fullname)`232233An 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.234235Если исходный код доступен, метод должен возвращать путь к файлу исходного кода, независимо от того, использовался ли байткод для загрузки модуля.236237#### `class importlib.abc.FileLoader(fullname, path)`238239Абстрактный базовый класс, наследующий от [`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).240241Аргумент *fullname* – это полное разрешённое имя модуля, который должен обрабатывать загрузчик. Аргумент *path* – путь к файлу модуля.242243Новое в версии 3.3.244245#### `name`246247Имя модуля, который может обрабатывать загрузчик.248249#### `path`250251Путь к файлу модуля.252253#### `load_module(fullname)`254255Вызывает `load_module()` родительского класса.256257#### `get_filename(fullname)`258259Возвращает [`path`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.FileLoader.path).260261#### `get_data(path)`262263Returns the open, binary file for *path*.264265#### `class importlib.abc.SourceLoader`266267Абстрактный базовый класс для реализации загрузки исходных (и, опционально, байт-кодовых) файлов. Этот класс наследует как от [`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), требуя реализации следующих методов:268269- [`ResourceLoader.get_data()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.ResourceLoader.get_data)270- **[`ExecutionLoader.get_filename()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)**271272 Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.273274Абстрактные методы, определённые в этом классе, предназначены для добавления необязательной поддержки файлов байткода. Если не реализовывать эти необязательные методы, загрузчик сможет работать только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода *и* байткода; но он не поддерживает *загрузку без исходного кода*, когда предоставляется только байткод. Файлы байткода являются оптимизацией, ускоряющей загрузку за счёт исключения этапа разбора компилятором Python, и поэтому никакой специфичный для байткода API не предоставляется.275276#### `path_stats(path)`277278Необязательный абстрактный метод, возвращающий [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict), содержащий метаданные о указанном пути. Поддерживаемые ключи словаря:279280- `'mtime'` (обязательно): целое число или число с плавающей точкой, представляющее время изменения исходного кода;281- `'size'` (необязательно): размер исходного кода в байтах.282283Все остальные ключи в словаре игнорируются, чтобы обеспечить возможность будущих расширений.284285Новое в версии 3.3.286287#### `path_mtime(path)`288289Необязательный абстрактный метод, возвращающий время изменения указанного пути.290291Устарело с версии 3.3: Этот метод устарел в пользу [`path_stats()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.SourceLoader.path_stats). Его можно не реализовывать, но он всё ещё доступен для целей обратной совместимости.292293#### `set_data(path, data)`294295Необязательный абстрактный метод, записывающий указанные байты в файл по заданному пути. Все недостающие промежуточные каталоги должны быть созданы автоматически.296297Если запись по пути не удаётся, потому что путь доступен только для чтения ([`errno.EACCES`](https://python-all.ru/3.3/library/errno.html#errno.EACCES)/[`PermissionError`](https://python-all.ru/3.3/library/exceptions.html#PermissionError)), не распространяйте исключение.298299#### `get_code(fullname)`300301Конкретная реализация метода [`InspectLoader.get_code()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.InspectLoader.get_code).302303#### `load_module(fullname)`304305Конкретная реализация метода [`Loader.load_module()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.Loader.load_module).306307#### `get_source(fullname)`308309Конкретная реализация метода [`InspectLoader.get_source()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.InspectLoader.get_source).310311#### `is_package(fullname)`312313Конкретная реализация метода [`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__`.314315#### `class importlib.abc.PyLoader`316317Абстрактный базовый класс, наследующий от [`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 будут обрабатываться конкретными реализациями ключевых методов.318319Устарело с версии 3.2: Этот класс устарел в пользу [`SourceLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.SourceLoader) и запланирован к удалению в Python 3.4. См. ниже, как создать подкласс, совместимый с Python 3.1 и выше.320321Если требуется совместимость с Python 3.1, используйте следующий подход для реализации подкласса, который будет работать с Python 3.1 и выше (обязательно реализуйте [`ExecutionLoader.get_filename()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)):322323```python324try:325 from importlib.abc import SourceLoader326except ImportError:327 from importlib.abc import PyLoader as SourceLoader328329class CustomLoader(SourceLoader):330 def get_filename(self, fullname):331 """Возвращает путь к исходному файлу."""332 # Реализует ...333334 def source_path(self, fullname):335 """Реализует source_path с помощью get_filename."""336 try:337 return self.get_filename(fullname)338 except ImportError:339 return None340341 def is_package(self, fullname):342 """Реализовать is_package путём поиска файла __init__343 имя, возвращаемое get_filename."""344 filename = os.path.basename(self.get_filename(fullname))345 return os.path.splitext(filename)[0] == '__init__'346```347348#### `source_path(fullname)`349350Абстрактный метод, возвращающий путь к исходному коду модуля. Должен возвращать `None`, если исходного кода нет. Возбуждает [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError), если загрузчик знает, что не может обработать модуль.351352#### `get_filename(fullname)`353354Конкретная реализация [`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).355356#### `load_module(fullname)`357358Конкретная реализация [`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__)]`.359360#### `get_code(fullname)`361362Конкретная реализация [`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).363364#### `get_source(fullname)`365366Конкретная реализация [`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).367368#### `class importlib.abc.PyPycLoader`369370Абстрактный базовый класс, наследующий от [`PyLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PyLoader). Этот ABC предназначен для помощи в создании загрузчиков, поддерживающих как исходный код Python, так и байткод.371372Устарело с версии 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). Обратите внимание, что это решение не будет поддерживать загрузку без исходного кода; только загрузку исходного кода *и* байткода.373374Изменено в версии 3.3: Обновлено для разбора (но не использования) нового поля размера исходного кода в файлах байткода при чтении и для корректной записи этого поля при записи.375376#### `source_mtime(fullname)`377378Абстрактный метод, который возвращает время изменения исходного кода указанного модуля. Время изменения должно быть целым числом. Если исходного кода нет, вернуть `None`. Если модуль не найден, возбуждается [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError).379380#### `bytecode_path(fullname)`381382Абстрактный метод, который возвращает путь к байткоду указанного модуля, если он существует. Возвращает `None`, если байткода (пока) нет. Возбуждает [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError), если загрузчик знает, что не может обработать модуль.383384#### `get_filename(fullname)`385386A 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.387388#### `write_bytecode(fullname, bytecode)`389390An 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.391392## 30.6.4. [`importlib.machinery`](https://python-all.ru/3.3/library/importlib.html#module-importlib.machinery) – Importers and path hooks393394Этот модуль содержит различные объекты, которые помогают [`import`](https://python-all.ru/3.3/reference/simple_stmts.html#import) находить и загружать модули.395396#### `importlib.machinery.SOURCE_SUFFIXES`397398Список строк, представляющих распознаваемые расширения файлов для исходных модулей.399400Новое в версии 3.3.401402#### `importlib.machinery.DEBUG_BYTECODE_SUFFIXES`403404Список строк, представляющих расширения файлов для неоптимизированных байт-код модулей.405406Новое в версии 3.3.407408#### `importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES`409410Список строк с расширениями файлов для оптимизированных модулей байткода.411412Новое в версии 3.3.413414#### `importlib.machinery.BYTECODE_SUFFIXES`415416Список строк, представляющих распознаваемые расширения файлов для байткод-модулей. Устанавливается в [`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__` истинным.417418Новое в версии 3.3.419420#### `importlib.machinery.EXTENSION_SUFFIXES`421422Список строк с распознаваемыми расширениями файлов для модулей расширений.423424Новое в версии 3.3.425426#### `importlib.machinery.all_suffixes()`427428Returns 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))429430Новое в версии 3.3.431432#### `class importlib.machinery.BuiltinImporter`433434[*Импортер*](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).435436В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.437438#### `class importlib.machinery.FrozenImporter`439440[*Импортер*](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).441442В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.443444#### `class importlib.machinery.WindowsRegistryFinder`445446[*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).447448В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.449450Новое в версии 3.3.451452#### `class importlib.machinery.PathFinder`453454[*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).455456В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.457458#### `classmethod find_module(fullname, path=None)`459460Class 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.461462#### `classmethod invalidate_caches()`463464Вызывает [`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).465466#### `class importlib.machinery.FileFinder(path, *loader_details)`467468Конкретная реализация [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.PathEntryFinder), которая кэширует результаты из файловой системы.469470Аргумент *path* – это каталог, за поиск в котором отвечает искатель.471472Аргумент *loader\_details* – это переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознает. Загрузчики должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.473474Поисковик будет кэшировать содержимое каталогов по мере необходимости, выполняя вызовы stat для каждого поиска модуля, чтобы убедиться, что кэш не устарел. Поскольку устаревание кэша зависит от точности информации о состоянии файловой системы, предоставляемой операционной системой, существует потенциальное состояние гонки: поиск модуля, создание нового файла и последующий поиск модуля, который представляет этот новый файл. Если операции выполняются достаточно быстро, чтобы уложиться в точность вызовов stat, то поиск модуля завершится неудачей. Чтобы этого избежать, при динамическом создании модуля обязательно вызывайте [`importlib.invalidate_caches()`](https://python-all.ru/3.3/library/importlib.html#importlib.invalidate_caches).475476Новое в версии 3.3.477478#### `path`479480Путь, в котором будет искать искатель.481482#### `find_loader(fullname)`483484Попытка найти загрузчик для обработки *fullname* в [`path`](https://python-all.ru/3.3/library/importlib.html#importlib.machinery.FileFinder.path).485486#### `invalidate_caches()`487488Очищает внутренний кеш.489490#### `classmethod path_hook(*loader_details)`491492Метод класса, который возвращает замыкание для использования в [`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* косвенно.493494Если аргумент замыкания не является существующим каталогом, возникает [`ImportError`](https://python-all.ru/3.3/library/exceptions.html#ImportError).495496#### `class importlib.machinery.SourceFileLoader(fullname, path)`497498Конкретная реализация [`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) и предоставления некоторых конкретных реализаций других методов.499500Новое в версии 3.3.501502#### `name`503504Имя модуля, который будет обрабатывать этот загрузчик.505506#### `path`507508Путь к исходному файлу.509510#### `is_package(fullname)`511512Возвращает true, если [`path`](https://python-all.ru/3.3/library/importlib.html#importlib.machinery.SourceFileLoader.path) указывает на пакет.513514#### `path_stats(path)`515516Конкретная реализация [`importlib.abc.SourceLoader.path_stats()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.SourceLoader.path_stats).517518#### `set_data(path, data)`519520Конкретная реализация [`importlib.abc.SourceLoader.set_data()`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.SourceLoader.set_data).521522#### `class importlib.machinery.SourcelessFileLoader(fullname, path)`523524Конкретная реализация [`importlib.abc.FileLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.FileLoader), которая может импортировать файлы байт-кода (т.е. файлы исходного кода отсутствуют).525526Обратите внимание, что прямое использование файлов байт-кода (а не файлов исходного кода) препятствует тому, чтобы ваши модули могли использоваться всеми реализациями Python или новыми версиями Python, изменяющими формат байт-кода.527528Новое в версии 3.3.529530#### `name`531532Имя модуля, который будет обрабатывать загрузчик.533534#### `path`535536Путь к файлу байт-кода.537538#### `is_package(fullname)`539540Определяет, является ли модуль пакетом, на основе [`path`](https://python-all.ru/3.3/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).541542#### `get_code(fullname)`543544Возвращает объект кода для [`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).545546#### `get_source(fullname)`547548Возвращает `None`, поскольку при использовании этого загрузчика файлы байт-кода не имеют исходного кода.549550#### `class importlib.machinery.ExtensionFileLoader(fullname, path)`551552Конкретная реализация [`importlib.abc.InspectLoader`](https://python-all.ru/3.3/library/importlib.html#importlib.abc.InspectLoader) для модулей расширений.553554Аргумент *fullname* задаёт имя модуля, который должен поддерживать загрузчик. Аргумент *path* – это путь к файлу модуля-расширения.555556Новое в версии 3.3.557558#### `name`559560Имя модуля, который поддерживает загрузчик.561562#### `path`563564Путь к модулю-расширению.565566#### `load_module(fullname)`567568Загружает модуль расширения только в том случае, если *fullname* совпадает с [`name`](https://python-all.ru/3.3/library/importlib.html#importlib.machinery.ExtensionFileLoader.name) или является `None`.569570#### `is_package(fullname)`571572Возвращает `True`, если путь к файлу указывает на модуль `__init__` пакета на основе [`EXTENSION_SUFFIXES`](https://python-all.ru/3.3/library/importlib.html#importlib.machinery.EXTENSION_SUFFIXES).573574#### `get_code(fullname)`575576Возвращает `None`, поскольку у модулей расширения нет объекта кода.577578#### `get_source(fullname)`579580Возвращает `None`, поскольку модули-расширения не имеют исходного кода.581582## 30.6.5. [`importlib.util`](https://python-all.ru/3.3/library/importlib.html#module-importlib.util) – Вспомогательный код для импортёров583584Этот модуль содержит различные объекты, помогающие в создании [*импортёра*](https://python-all.ru/3.3/glossary.html#term-importer).585586#### `importlib.util.resolve_name(name, package)`587588Преобразует относительное имя модуля в абсолютное.589590Если **name** не содержит начальных точек, то просто возвращается **name**. Это позволяет использовать, например, `importlib.util.resolve_name('sys', __package__)` без проверки того,\\нуказан ли аргумент **package**.591592[`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`).593594Новое в версии 3.3.595596#### `@importlib.util.module_for_loader`597598Декоратор [*декоратор*](https://python-all.ru/3.3/glossary.html#term-decorator) для метода [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader), предназначенный для выбора подходящего объекта модуля для загрузки. Декорированный метод должен иметь сигнатуру вызова с двумя позиционными аргументами (например, `load_module(self, module)`), где второй аргумент будет **объектом** модуля, используемым загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами из-за предположения о двух аргументах.599600Декорированный метод будет принимать имя **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), будет передан в метод.601602Если декорированный метод вызывает исключение и модуль был добавлен в [`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), то он остаётся без изменений.603604Использование этого декоратора берёт на себя все детали того, какой объект модуля должен инициализировать загрузчик, как указано в [**PEP 302**](https://python-all.ru/3.3/library/importlib.html), настолько хорошо, насколько это возможно.605606Изменено в версии 3.3: `__loader__` и `__package__` автоматически устанавливаются (когда это возможно).607608#### `@importlib.util.set_loader`609610> Декоратор611>612> [*декоратор*](https://python-all.ru/3.3/glossary.html#term-decorator)613>614> для метода615>616> [*загрузчика*](https://python-all.ru/3.3/glossary.html#term-loader)617>618> , предназначенный для установки атрибута619>620> `__loader__`621>622> на загруженных модулях. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обёрнутого метода (т.е.623>624> `self`625>626> ) – это то, на что должен быть установлен627>628> `__loader__`629>630> .631632> **Примечание**633>634> Рекомендуется использовать [`module_for_loader()`](https://python-all.ru/3.3/library/importlib.html#importlib.util.module_for_loader) вместо этого декоратора, поскольку он включает в себя эту функциональность.635636#### `@importlib.util.set_package`637638> Декоратор [*декоратор*](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).639>640> Использовать этот декоратор не рекомендуется, если есть возможность установить `__package__` до импорта. При предварительной установке код модуля выполняется с установленным атрибутом и, таким образом, может быть использован глобальным кодом во время инициализации.641642> **Примечание**643>644> Рекомендуется использовать [`module_for_loader()`](https://python-all.ru/3.3/library/importlib.html#importlib.util.module_for_loader) вместо этого декоратора, поскольку он включает в себя эту функциональность.645