importlib.md
1> **Источник:** https://python-all.ru/3.10/library/importlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `importlib` – реализация `import`89Новое в версии 3.1.1011**Исходный код:** [Lib/importlib/\_\_init\_\_.py](https://python-all.ru/src/3.10/Lib/importlib/__init__.py)1213---1415## Введение1617Назначение пакета [`importlib`](https://python-all.ru/3.10/library/importlib.html#module-importlib) двоякое. Во-первых, предоставить реализацию оператора [`import`](https://python-all.ru/3.10/reference/simple_stmts.html#import) (а значит, и функции [`__import__()`](https://python-all.ru/3.10/library/functions.html#import__)) в исходном коде Python. Это даёт реализацию `import`, переносимую в любой интерпретатор Python. Кроме того, такая реализация легче для понимания, чем написанная на другом языке программирования.1819Вторая – в этом пакете предоставлены компоненты для реализации [`import`](https://python-all.ru/3.10/reference/simple_stmts.html#import), что упрощает пользователям создание собственных объектов (обобщённо называемых [importer](https://python-all.ru/3.10/glossary.html#term-importer)) для участия в процессе импорта.2021> **См. также**22>23> **[Оператор import](https://python-all.ru/3.10/reference/simple_stmts.html#import)**24>25> Справочник по языку для оператора [`import`](https://python-all.ru/3.10/reference/simple_stmts.html#import).26>27> **[Спецификация пакетов](https://python-all.ru/3.10/library/importlib.html)**28>29> Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе `None` в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules)).30>31> **Функция [`__import__()`](https://python-all.ru/3.10/library/importlib.html#importlib.__import__)**32>33> Оператор [`import`](https://python-all.ru/3.10/reference/simple_stmts.html#import) – это синтаксический сахар для этой функции.34>35> **[**PEP 235**](https://python-all.ru/3.10/library/importlib.html)**36>37> Импорт на платформах, нечувствительных к регистру38>39> **[**PEP 263**](https://python-all.ru/3.10/library/importlib.html)**40>41> Определение кодировок исходного кода Python42>43> **[**PEP 302**](https://python-all.ru/3.10/library/importlib.html)**44>45> Новые хуки импорта46>47> **[**PEP 328**](https://python-all.ru/3.10/library/importlib.html)**48>49> Импорт: многострочный и абсолютный/относительный50>51> **[**PEP 366**](https://python-all.ru/3.10/library/importlib.html)**52>53> Явные относительные импорты в главном модуле54>55> **[**PEP 420**](https://python-all.ru/3.10/library/importlib.html)**56>57> Неявные пакеты пространств имён58>59> **[**PEP 451**](https://python-all.ru/3.10/library/importlib.html)**60>61> Тип ModuleSpec для системы импорта62>63> **[**PEP 488**](https://python-all.ru/3.10/library/importlib.html)**64>65> Устранение PYO-файлов66>67> **[**PEP 489**](https://python-all.ru/3.10/library/importlib.html)**68>69> Многофазная инициализация модулей расширения70>71> **[**PEP 552**](https://python-all.ru/3.10/library/importlib.html)**72>73> Детерминированные pyc-файлы74>75> **[**PEP 3120**](https://python-all.ru/3.10/library/importlib.html)**76>77> Использование UTF-8 в качестве кодировки исходного кода по умолчанию78>79> **[**PEP 3147**](https://python-all.ru/3.10/library/importlib.html)**80>81> Каталоги репозитория PYC8283## Функции8485#### `importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)`8687Реализация встроенной функции [`__import__()`](https://python-all.ru/3.10/library/functions.html#import__).8889> **Примечание**90>91> Для программного импорта модулей следует использовать [`import_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.import_module) вместо данной функции.9293#### `importlib.import_module(name, package=None)`9495Импортирует модуль. Аргумент *name* задаёт импортируемый модуль в абсолютном или относительном выражении (например, `pkg.mod` или `..mod`). Если имя задано в относительном выражении, то аргумент *package* должен быть установлен в имя пакета, который будет служить якорем для разрешения имени пакета (например, `import_module('..mod', 'pkg.subpkg')` импортирует `pkg.mod`).9697Функция [`import_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.import_module) действует как упрощающая обёртка вокруг [`importlib.__import__()`](https://python-all.ru/3.10/library/importlib.html#importlib.__import__). Это означает, что вся семантика функции проистекает из [`importlib.__import__()`](https://python-all.ru/3.10/library/importlib.html#importlib.__import__). Самое важное различие между этими двумя функциями заключается в том, что [`import_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.import_module) возвращает указанный пакет или модуль (например, `pkg.mod`), а [`__import__()`](https://python-all.ru/3.10/library/functions.html#import__) возвращает корневой пакет или модуль (например, `pkg`).9899При динамическом импорте модуля, созданного после запуска интерпретатора (например, создан Python-файл), может потребоваться вызов [`invalidate_caches()`](https://python-all.ru/3.10/library/importlib.html#importlib.invalidate_caches), чтобы новый модуль был замечен системой импорта.100101Изменено в версии 3.3: Родительские пакеты импортируются автоматически.102103#### `importlib.find_loader(name, path=None)`104105Находит загрузчик для модуля, опционально в пределах указанного *path*. Если модуль находится в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules), то возвращается `sys.modules[name].__loader__` (если только загрузчик не окажется `None` или не будет установлен; в этом случае возбуждается [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError)). В противном случае выполняется поиск с помощью [`sys.meta_path`](https://python-all.ru/3.10/library/sys.html#sys.meta_path). `None` возвращается, если загрузчик не найден.106107Точечное имя не импортирует неявно свои родительские пакеты, так как для этого требуется их загрузка, что может быть нежелательно. Чтобы правильно импортировать подмодуль, необходимо импортировать все родительские пакеты подмодуля и указать правильный аргумент *path*.108109Новое в версии 3.3.110111Изменено в версии 3.4: Если `__loader__` не установлен, возбуждается [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError), так же как и когда атрибут установлен в `None`.112113Устарело с версии 3.4: Вместо этого используйте [`importlib.util.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.find_spec).114115#### `importlib.invalidate_caches()`116117Инвалидирует внутренние кеши искателей, хранящиеся в [`sys.meta_path`](https://python-all.ru/3.10/library/sys.html#sys.meta_path). Если искатель реализует `invalidate_caches()`, то он будет вызван для выполнения инвалидации. Эту функцию следует вызывать при создании или установке любых модулей во время работы программы, чтобы гарантировать, что все искатели заметят существование нового модуля.118119Новое в версии 3.3.120121#### `importlib.reload(module)`122123Перезагружает ранее импортированный *модуль*. Аргумент должен быть объектом модуля, то есть он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля во внешнем редакторе и хотите опробовать новую версию, не выходя из интерпретатора Python. Возвращаемое значение – объект модуля (который может отличаться, если повторный импорт помещает другой объект в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules)).124125Когда выполняется [`reload()`](https://python-all.ru/3.10/library/importlib.html#importlib.reload):126127- Код модуля Python перекомпилируется, а код уровня модуля выполняется заново, создавая новый набор объектов, которые привязываются к именам в словаре модуля путём повторного использования [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader), который изначально загрузил модуль. Функция `init` модулей расширения не вызывается повторно.128- Как и все другие объекты в Python, старые объекты освобождаются только после того, как счётчики ссылок на них упадут до нуля.129- Имена в пространстве имён модуля обновляются, чтобы указывать на новые или изменённые объекты.130- Другие ссылки на старые объекты (например, имена вне модуля) не перепривязываются для указания на новые объекты и должны быть обновлены в каждом пространстве имён, где они встречаются, если это необходимо.131132Существует ряд других предостережений:133134При перезагрузке модуля его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имён заменяют старые определения, так что это обычно не проблема. Если новая версия модуля не определяет имя, которое было определено старой версией, старое определение сохраняется. Эта возможность может быть использована в пользу модуля, если он поддерживает глобальную таблицу или кеш объектов – с помощью оператора [`try`](https://python-all.ru/3.10/reference/compound_stmts.html#try) можно проверить наличие таблицы и пропустить её инициализацию, если требуется:135136```python137try:138 cache139except NameError:140 cache = {}141```142143Перезагружать встроенные или динамически загружаемые модули обычно не очень полезно. Перезагрузка [`sys`](https://python-all.ru/3.10/library/sys.html#module-sys), [`__main__`](https://python-all.ru/3.10/library/__main__.html#module-__main__), [`builtins`](https://python-all.ru/3.10/library/builtins.html#module-builtins) и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не рассчитаны на инициализацию более одного раза и могут отказывать непредсказуемым образом при перезагрузке.144145Если модуль импортирует объекты из другого модуля с помощью [`from`](https://python-all.ru/3.10/reference/simple_stmts.html#from) … [`import`](https://python-all.ru/3.10/reference/simple_stmts.html#import) …, вызов [`reload()`](https://python-all.ru/3.10/library/importlib.html#importlib.reload) для другого модуля не переопределяет импортированные из него объекты – один из способов обойти это – повторно выполнить оператор `from`, другой – использовать `import` и полные имена (*module.name*) вместо этого.146147Если модуль создаёт экземпляры класса, перезагрузка модуля, в котором определён класс, не влияет на определения методов этих экземпляров – они продолжают использовать старое определение класса. То же самое верно и для производных классов.148149Новое в версии 3.4.150151Изменено в версии 3.7: [`ModuleNotFoundError`](https://python-all.ru/3.10/library/exceptions.html#ModuleNotFoundError) возникает, когда перезагружаемый модуль не имеет [`ModuleSpec`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.ModuleSpec).152153## [`importlib.abc`](https://python-all.ru/3.10/library/importlib.html#module-importlib.abc) – абстрактные базовые классы, связанные с импортом154155**Исходный код:** [Lib/importlib/abc.py](https://python-all.ru/src/3.10/Lib/importlib/abc.py)156157---158159Модуль [`importlib.abc`](https://python-all.ru/3.10/library/importlib.html#module-importlib.abc) содержит все основные абстрактные базовые классы, используемые [`import`](https://python-all.ru/3.10/reference/simple_stmts.html#import). Также предоставляются некоторые подклассы основных абстрактных базовых классов, помогающие в реализации основных ABC.160161Иерархия ABC:162163```python164object165 +-- Finder (deprecated)166 +-- MetaPathFinder167 +-- PathEntryFinder168 +-- Loader169 +-- ResourceLoader --------+170 +-- InspectLoader |171 +-- ExecutionLoader --+172 +-- FileLoader173 +-- SourceLoader174```175176#### `class importlib.abc.Finder`177178Абстрактный базовый класс, представляющий [искатель](https://python-all.ru/3.10/glossary.html#term-finder).179180Устарело с версии 3.3: Используйте [`MetaPathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder) или [`PathEntryFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder) вместо этого.181182#### `abstractmethod find_module(fullname, path=None)`183184Абстрактный метод для поиска [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader) для указанного модуля. Изначально описан в [**PEP 302**](https://python-all.ru/3.10/library/importlib.html), этот метод предназначался для использования в [`sys.meta_path`](https://python-all.ru/3.10/library/sys.html#sys.meta_path) и в подсистеме импорта на основе путей.185186Изменено в версии 3.4: При вызове возвращает `None` вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).187188Устарело с версии 3.10: Вместо этого реализуйте [`MetaPathFinder.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) или [`PathEntryFinder.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).189190#### `class importlib.abc.MetaPathFinder`191192Абстрактный базовый класс, представляющий [мета-искатель путей](https://python-all.ru/3.10/glossary.html#term-meta-path-finder).193194Новое в версии 3.3.195196Изменено в версии 3.10: Больше не является подклассом [`Finder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Finder).197198#### `find_spec(fullname, path, target=None)`199200Абстрактный метод для поиска [спецификации](https://python-all.ru/3.10/glossary.html#term-module-spec) для указанного модуля. Если это импорт верхнего уровня, *path* будет `None`. В противном случае это поиск подпакета или модуля, и *path* будет значением [`__path__`](https://python-all.ru/3.10/reference/import.html#path__) из родительского пакета. Если спецификацию не удаётся найти, возвращается `None`. При передаче `target` является объектом модуля, который искатель может использовать для более обоснованного предположения о том, какую спецификацию вернуть. [`importlib.util.spec_from_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.spec_from_loader) может быть полезен для реализации конкретных `MetaPathFinders`.201202Новое в версии 3.4.203204#### `find_module(fullname, path)`205206Устаревший метод для поиска [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader) для указанного модуля. Если это импорт верхнего уровня, *path* будет равен `None`. В противном случае выполняется поиск подпакета или модуля и *path* будет значением [`__path__`](https://python-all.ru/3.10/reference/import.html#path__) из родительского пакета. Если загрузчик не найден, `None` возвращается.207208Если определён [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder.find_spec), обеспечивается обратно совместимая функциональность.209210Изменено в версии 3.4: Возвращает `None` при вызове вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError). Можно использовать [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) для обеспечения функциональности.211212Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder.find_spec).213214#### `invalidate_caches()`215216Необязательный метод, который при вызове должен инвалидировать любой внутренний кеш, используемый искателем. Используется [`importlib.invalidate_caches()`](https://python-all.ru/3.10/library/importlib.html#importlib.invalidate_caches) при инвалидации кешей всех искателей на [`sys.meta_path`](https://python-all.ru/3.10/library/sys.html#sys.meta_path).217218Изменено в версии 3.4: Возвращает `None` при вызове вместо `NotImplemented`.219220#### `class importlib.abc.PathEntryFinder`221222Абстрактный базовый класс, представляющий [искатель записей путей](https://python-all.ru/3.10/glossary.html#term-path-entry-finder). Хотя он имеет некоторое сходство с [`MetaPathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder), `PathEntryFinder` предназначен для использования только внутри подсистемы импорта на основе путей, предоставляемой [`importlib.machinery.PathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.PathFinder).223224Новое в версии 3.3.225226Изменено в версии 3.10: Больше не является подклассом [`Finder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Finder).227228#### `find_spec(fullname, target=None)`229230Абстрактный метод для поиска [спецификации](https://python-all.ru/3.10/glossary.html#term-module-spec) для указанного модуля. Искатель будет искать модуль только в пределах той [записи пути](https://python-all.ru/3.10/glossary.html#term-path-entry), к которой он привязан. Если спецификацию не удаётся найти, возвращается `None`. При передаче `target` является объектом модуля, который искатель может использовать для более обоснованного предположения о том, какую спецификацию вернуть. [`importlib.util.spec_from_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.spec_from_loader) может быть полезен для реализации конкретных `PathEntryFinders`.231232Новое в версии 3.4.233234#### `find_loader(fullname)`235236Устаревший метод для поиска [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader) для указанного модуля. Возвращает кортеж из двух элементов `(loader, portion)`, где `portion` – последовательность местоположений файловой системы, вносящих вклад в часть пакета пространства имён. Загрузчик может быть `None`, а `portion` указывает на вклад местоположений файловой системы в пакет пространства имён. Пустой список можно использовать для `portion`, чтобы указать, что загрузчик не является частью пакета пространства имён. Если `loader` равен `None` и `portion` – пустой список, то загрузчик или местоположение для пакета пространства имён не найдены (т.е. не удалось ничего найти для модуля).237238Если определён [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_spec), обеспечивается обратно совместимая функциональность.239240Изменено в версии 3.4: Возвращает `(None, [])` вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError). Использует [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) при наличии для обеспечения функциональности.241242Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).243244#### `find_module(fullname)`245246Конкретная реализация [`Finder.find_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Finder.find_module), эквивалентная `self.find_loader(fullname)[0]`.247248Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).249250#### `invalidate_caches()`251252Необязательный метод, который при вызове должен инвалидировать любой внутренний кеш, используемый искателем. Используется [`importlib.machinery.PathFinder.invalidate_caches()`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.PathFinder.invalidate_caches) при инвалидации кешей всех кешированных искателей.253254#### `class importlib.abc.Loader`255256Абстрактный базовый класс для [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader). См. [**PEP 302**](https://python-all.ru/3.10/library/importlib.html) для точного определения загрузчика.257258Загрузчики, желающие поддерживать чтение ресурсов, должны реализовать метод `get_resource_reader(fullname)`, как указано в [`importlib.abc.ResourceReader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceReader).259260Изменено в версии 3.7: Введён необязательный метод `get_resource_reader()`.261262#### `create_module(spec)`263264Метод, который возвращает объект модуля для использования при импорте модуля. Этот метод может вернуть `None`, что означает, что должна применяться семантика создания модуля по умолчанию.265266Новое в версии 3.4.267268Изменено в версии 3.5: Начиная с Python 3.6, этот метод перестанет быть необязательным, если определён [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module).269270#### `exec_module(module)`271272Абстрактный метод, который выполняет модуль в его собственном пространстве имён при импорте или перезагрузке модуля. Модуль уже должен быть проинициализирован к моменту вызова `exec_module()`. Если этот метод определён, [`create_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.create_module) также должен быть определён.273274Новое в версии 3.4.275276Изменено в версии 3.6: [`create_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.create_module) также должен быть определён.277278#### `load_module(fullname)`279280Устаревший метод загрузки модуля. Если модуль не может быть загружен, вызывается [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError), иначе возвращается загруженный модуль.281282Если запрошенный модуль уже существует в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules), то следует использовать и перезагрузить именно его. В противном случае загрузчик должен создать новый модуль и вставить его в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules) до начала загрузки, чтобы избежать рекурсии при импорте. Если загрузчик вставил модуль, но загрузка завершилась неудачей, он должен удалить его из [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules); модули, уже находившиеся в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules) до начала работы загрузчика, следует оставить нетронутыми (см. [`importlib.util.module_for_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.module_for_loader)).283284Загрузчик должен установить несколько атрибутов модуля. (Обратите внимание, что некоторые из этих атрибутов могут измениться при перезагрузке модуля):285286- **[`__name__`](https://python-all.ru/3.10/reference/import.html#name__)**287288 Имя модуля.289- **[`__file__`](https://python-all.ru/3.10/reference/import.html#file__)**290291 Путь к месту хранения данных модуля (не задан для встроенных модулей).292- **[`__cached__`](https://python-all.ru/3.10/reference/import.html#cached__)**293294 Путь к месту, где хранится или должна храниться скомпилированная версия модуля (не задан, если атрибут неуместен).295- **[`__path__`](https://python-all.ru/3.10/reference/import.html#path__)**296297 Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.298- **[`__package__`](https://python-all.ru/3.10/reference/import.html#package__)**299300 Полное имя пакета, в котором модуль был загружен как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов это то же самое, что [`__name__`](https://python-all.ru/3.10/reference/import.html#name__). Декоратор [`importlib.util.module_for_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.module_for_loader) может самостоятельно обработать детали для [`__package__`](https://python-all.ru/3.10/reference/import.html#package__).301- **[`__loader__`](https://python-all.ru/3.10/reference/import.html#loader__)**302303 Загрузчик, используемый для загрузки модуля. Декоратор [`importlib.util.module_for_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.module_for_loader) может самостоятельно обработать детали для [`__package__`](https://python-all.ru/3.10/reference/import.html#package__).304305Если [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module) доступен, то предоставляется обратно совместимая функциональность.306307Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) при вызове вместо [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError). Функциональность доступна, если [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module) присутствует.308309Устарело с версии 3.4: Рекомендуемый API для загрузки модуля – [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module) (и [`create_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.create_module)). Загрузчики должны реализовывать его вместо load\_module(). Механизм импорта берёт на себя все остальные обязанности load\_module(), когда реализован exec\_module().310311#### `module_repr(module)`312313Устаревший метод, который при реализации вычисляет и возвращает строковое представление заданного модуля в виде строки. Стандартный repr() для типа модуля будет использовать результат этого метода по необходимости.314315Новое в версии 3.3.316317Изменено в версии 3.4: Сделано необязательным вместо абстрактного метода.318319Устарело с версии 3.4: Механизм импорта теперь заботится об этом автоматически.320321#### `class importlib.abc.ResourceReader`322323*Заменено на TraversableResources*324325An [abstract base class](https://python-all.ru/3.10/glossary.html#term-abstract-base-class) to provide the ability to read *resources*.326327С точки зрения этого ABC, *ресурс* – это бинарный артефакт, поставляемый внутри пакета. Обычно это что-то вроде файла данных, который находится рядом с `__init__.py` файлом пакета. Назначение этого класса – абстрагировать доступ к таким файлам данных, чтобы не имело значения, хранятся ли пакет и его файлы данных, например, в zip-архиве или в файловой системе.328329Для любого из методов этого класса аргумент *resource* должен быть [path-подобным объектом](https://python-all.ru/3.10/glossary.html#term-path-like-object), который по сути представляет собой имя файла. Это означает, что в аргументе *resource* не должно быть путей к подкаталогам. Это связано с тем, что местоположение пакета, для которого предназначен читатель, выступает в роли «каталога». Следовательно, метафора каталогов и имён файлов – это пакеты и ресурсы соответственно. Именно поэтому экземпляры этого класса должны напрямую соответствовать конкретному пакету (а не потенциально представлять несколько пакетов или модуль).330331Загрузчики, желающие поддерживать чтение ресурсов, должны предоставить метод с именем `get_resource_reader(fullname)`, который возвращает объект, реализующий интерфейс этого ABC. Если модуль, указанный fullname, не является пакетом, этот метод должен вернуть [`None`](https://python-all.ru/3.10/library/constants.html#None). Объект, совместимый с этим ABC, должен возвращаться только тогда, когда указанный модуль является пакетом.332333Добавлено в версии 3.7.334335#### `abstractmethod open_resource(resource)`336337Возвращает открытый [файлоподобный объект](https://python-all.ru/3.10/glossary.html#term-file-like-object) для бинарного чтения *ресурса*.338339Если ресурс не найден, выбрасывается [`FileNotFoundError`](https://python-all.ru/3.10/library/exceptions.html#FileNotFoundError).340341#### `abstractmethod resource_path(resource)`342343Возвращает путь в файловой системе к *ресурсу*.344345Если ресурс не существует на файловой системе в конкретном виде, возбуждается [`FileNotFoundError`](https://python-all.ru/3.10/library/exceptions.html#FileNotFoundError).346347#### `abstractmethod is_resource(name)`348349Возвращает `True`, если указанный *name* считается ресурсом. [`FileNotFoundError`](https://python-all.ru/3.10/library/exceptions.html#FileNotFoundError) возникает, если *name* не существует.350351#### `abstractmethod contents()`352353Возвращает [итерируемый объект](https://python-all.ru/3.10/glossary.html#term-iterable) со строками по содержимому пакета. Обратите внимание, что не все имена, возвращаемые итератором, должны быть реальными ресурсами; например, допустимо возвращать имена, для которых [`is_resource()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceReader.is_resource) будет ложным.354355Разрешение возвращать имена, не являющиеся ресурсами, предусмотрено для ситуаций, когда заранее известно, как хранятся пакет и его ресурсы, и такие имена могут быть полезны. Например, разрешается возвращать имена подкаталогов, чтобы, когда известно, что пакет и ресурсы хранятся в файловой системе, эти имена подкаталогов можно было использовать напрямую.356357Абстрактный метод возвращает итерируемый объект без элементов.358359#### `class importlib.abc.ResourceLoader`360361Абстрактный базовый класс для [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.10/library/importlib.html) для загрузки произвольных ресурсов из бэкенда хранилища.362363Устарело с версии 3.7: Этот ABC устарел в пользу поддержки загрузки ресурсов через [`importlib.abc.ResourceReader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceReader).364365#### `abstractmethod get_data(path)`366367Абстрактный метод, возвращающий байты для данных, расположенных по пути *path*. Загрузчики, использующие файлоподобное хранилище, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод, чтобы обеспечить прямой доступ к хранимым данным. Если *path* не найден, возбуждается [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError). Ожидается, что *path* будет сформирован с использованием атрибута [`__file__`](https://python-all.ru/3.10/reference/import.html#file__) модуля или элемента из [`__path__`](https://python-all.ru/3.10/reference/import.html#path__) пакета.368369Изменено в версии 3.4: возбуждает [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).370371#### `class importlib.abc.InspectLoader`372373Абстрактный базовый класс для [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.10/library/importlib.html) для загрузчиков, которые инспектируют модули.374375#### `get_code(fullname)`376377Возвращает объект кода для модуля или `None`, если модуль не имеет объекта кода (как, например, для встроенного модуля). Возбуждает [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError), если загрузчик не может найти запрошенный модуль.378379> **Примечание**380>381> Хотя метод имеет реализацию по умолчанию, рекомендуется переопределить его, если это возможно для повышения производительности.382383Изменено в версии 3.4: Больше не является абстрактным, предоставлена конкретная реализация.384385#### `abstractmethod get_source(fullname)`386387Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием [универсальных символов новой строки](https://python-all.ru/3.10/glossary.html#term-universal-newlines), преобразуя все распознанные разделители строк в символы `'\n'`. Возвращает `None`, если исходный код недоступен (например, для встроенного модуля). Возбуждает [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError), если загрузчик не может найти указанный модуль.388389Изменено в версии 3.4: возбуждает [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).390391#### `is_package(fullname)`392393Необязательный метод, возвращающий истинное значение, если модуль является пакетом, и ложное в противном случае. [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) возбуждается, если [загрузчик](https://python-all.ru/3.10/glossary.html#term-loader) не может найти модуль.394395Изменено в версии 3.4: возбуждает [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).396397#### `static source_to_code(data, path='<string>')`398399Создаёт объект кода из исходного кода Python.400401Аргумент *data* может быть любым значением, которое поддерживает функция [`compile()`](https://python-all.ru/3.10/library/functions.html#compile) (т.е. строка или байты). Аргумент *path* должен быть «путём» к месту происхождения исходного кода, что может быть абстрактным понятием (например, местоположение в zip-файле).402403С помощью полученного объекта кода можно выполнить его в модуле, запустив `exec(code, module.__dict__)`.404405Новое в версии 3.4.406407Изменено в версии 3.5: метод стал статическим.408409#### `exec_module(module)`410411Реализация [`Loader.exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module).412413Новое в версии 3.4.414415#### `load_module(fullname)`416417Реализация [`Loader.load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module).418419Устарело с версии 3.4: используйте [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader.exec_module).420421#### `class importlib.abc.ExecutionLoader`422423Абстрактный базовый класс, наследующий от [`InspectLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader), который при реализации помогает выполнять модуль как скрипт. Этот ABC представляет необязательный протокол [**PEP 302**](https://python-all.ru/3.10/library/importlib.html).424425#### `abstractmethod get_filename(fullname)`426427Абстрактный метод, который должен возвращать значение [`__file__`](https://python-all.ru/3.10/reference/import.html#file__) для указанного модуля. Если путь недоступен, возбуждается [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError).428429Если исходный код доступен, метод должен возвращать путь к файлу исходного кода, независимо от того, использовался ли байткод для загрузки модуля.430431Изменено в версии 3.4: возбуждает [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).432433#### `class importlib.abc.FileLoader(fullname, path)`434435Абстрактный базовый класс, наследующий от [`ResourceLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceLoader) и [`ExecutionLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ExecutionLoader), предоставляющий конкретные реализации [`ResourceLoader.get_data()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceLoader.get_data) и [`ExecutionLoader.get_filename()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ExecutionLoader.get_filename).436437Аргумент *fullname* – это полное разрешённое имя модуля, который должен обрабатывать загрузчик. Аргумент *path* – путь к файлу модуля.438439Новое в версии 3.3.440441#### `name`442443Имя модуля, который может обрабатывать загрузчик.444445#### `path`446447Путь к файлу модуля.448449#### `load_module(fullname)`450451Вызывает `load_module()` родительского класса.452453Устарело с версии 3.4: Вместо этого используйте [`Loader.exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module).454455#### `abstractmethod get_filename(fullname)`456457Возвращает [`path`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.FileLoader.path).458459#### `abstractmethod get_data(path)`460461Читает *path* как двоичный файл и возвращает байты из него.462463#### `class importlib.abc.SourceLoader`464465Абстрактный базовый класс для реализации загрузки файлов с исходным кодом (и, опционально, байткодом). Класс наследует от [`ResourceLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceLoader) и [`ExecutionLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ExecutionLoader), требуя реализации:466467- [`ResourceLoader.get_data()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceLoader.get_data)468- **[`ExecutionLoader.get_filename()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)**469470 Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.471472Абстрактные методы, определённые в этом классе, предназначены для добавления опциональной поддержки файлов байткода. Если не реализовать эти опциональные методы (или заставить их возбуждать [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError)), загрузчик будет работать только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода *и* байткода; это не допускает загрузку *без исходного кода*, когда предоставляется только байткод. Файлы байткода – это оптимизация для ускорения загрузки за счёт удаления этапа разбора компилятором Python, поэтому никакой специальный API для байткода не предоставляется.473474#### `path_stats(path)`475476Опциональный абстрактный метод, возвращающий [`dict`](https://python-all.ru/3.10/library/stdtypes.html#dict), содержащий метаданные о заданном пути. Поддерживаемые ключи словаря:477478- `'mtime'` (обязательный): целое число или число с плавающей точкой, представляющее время изменения исходного кода;479- `'size'` (необязательный): размер исходного кода в байтах.480481Любые другие ключи в словаре игнорируются – это позволяет добавлять расширения в будущем. Если с путём не удаётся работать, возбуждается [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError).482483Новое в версии 3.3.484485Изменено в версии 3.4: Теперь возбуждается [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).486487#### `path_mtime(path)`488489Необязательный абстрактный метод, возвращающий время изменения указанного пути.490491Устарело с версии 3.3: Этот метод устарел в пользу [`path_stats()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.SourceLoader.path_stats). Реализовывать его необязательно, но он всё ещё доступен для совместимости. Если путь не удаётся обработать, возбуждается [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError).492493Изменено в версии 3.4: Теперь возбуждается [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).494495#### `set_data(path, data)`496497Необязательный абстрактный метод, записывающий указанные байты в файл по заданному пути. Все недостающие промежуточные каталоги должны быть созданы автоматически.498499Если запись по пути не удаётся из-за того, что путь доступен только для чтения ([`errno.EACCES`](https://python-all.ru/3.10/library/errno.html#errno.EACCES)/[`PermissionError`](https://python-all.ru/3.10/library/exceptions.html#PermissionError)), исключение не должно распространяться.500501Изменено в версии 3.4: Больше не возбуждает [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError) при вызове.502503#### `get_code(fullname)`504505Конкретная реализация [`InspectLoader.get_code()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader.get_code).506507#### `exec_module(module)`508509Конкретная реализация [`Loader.exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module).510511Новое в версии 3.4.512513#### `load_module(fullname)`514515Конкретная реализация [`Loader.load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module).516517Устарело с версии 3.4: Вместо этого используйте [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.SourceLoader.exec_module).518519#### `get_source(fullname)`520521Конкретная реализация [`InspectLoader.get_source()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader.get_source).522523#### `is_package(fullname)`524525Конкретная реализация [`InspectLoader.is_package()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader.is_package). Модуль считается пакетом, если его путь к файлу (получаемый через [`ExecutionLoader.get_filename()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)) представляет собой файл с именем `__init__` после удаления расширения **и** само имя модуля не оканчивается на `__init__`.526527#### `class importlib.abc.Traversable`528529Объект с подмножеством методов [`pathlib.Path`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path), подходящих для обхода каталогов и открытия файлов.530531Для представления объекта в файловой системе используйте [`importlib.resources.as_file()`](https://python-all.ru/3.10/library/importlib.html#importlib.resources.as_file).532533Новое в версии 3.9.534535#### `abstractmethod name()`536537Базовое имя этого объекта без каких-либо ссылок на родителя.538539#### `abstractmethod iterdir()`540541Возвращает объекты Traversable внутри self.542543#### `abstractmethod is_dir()`544545Возвращает True, если self является каталогом.546547#### `abstractmethod is_file()`548549Возвращает True, если self является файлом.550551#### `abstractmethod joinpath(child)`552553Возвращает дочерний элемент Traversable в self.554555#### `abstractmethod __truediv__(child)`556557Возвращает дочерний элемент Traversable в self.558559#### `abstractmethod open(mode='r', *args, **kwargs)`560561*mode* может быть 'r' или 'rb' для открытия в текстовом или бинарном режиме. Возвращает дескриптор, подходящий для чтения (то же самое, что [`pathlib.Path.open`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.open)).562563При открытии в текстовом режиме принимает параметры кодировки, аналогичные тем, что принимаются [`io.TextIOWrapper`](https://python-all.ru/3.10/library/io.html#io.TextIOWrapper).564565#### `read_bytes()`566567Читает содержимое self как байты.568569#### `read_text(encoding=None)`570571Читает содержимое self как текст.572573Примечание: начиная с Python 3.11 этот класс находится в `importlib.resources.abc`.574575#### `class importlib.abc.TraversableResources`576577Абстрактный базовый класс для читателей ресурсов, способных обслуживать интерфейс `files`. Подклассы ResourceReader предоставляют конкретные реализации абстрактных методов ResourceReader. Поэтому любой загрузчик, предоставляющий TraversableResources, также предоставляет ResourceReader.578579Загрузчики, поддерживающие чтение ресурсов, должны реализовать этот интерфейс.580581Новое в версии 3.9.582583Примечание: начиная с Python 3.11 этот класс находится в `importlib.resources.abc`.584585## [`importlib.resources`](https://python-all.ru/3.10/library/importlib.html#module-importlib.resources) – Resources586587**Исходный код:** [Lib/importlib/resources.py](https://python-all.ru/src/3.10/Lib/importlib/resources.py)588589---590591Добавлено в версии 3.7.592593Этот модуль использует систему импорта Python для предоставления доступа к *ресурсам* внутри *пакетов*. Если пакет можно импортировать, то можно получить доступ к ресурсам внутри этого пакета. Ресурсы можно открывать или читать в двоичном или текстовом режиме.594595Ресурсы примерно аналогичны файлам внутри каталогов, хотя важно помнить, что это всего лишь метафора. Ресурсы и пакеты **не обязаны** существовать как физические файлы и каталоги в файловой системе.596597> **Примечание**598>599> Этот модуль предоставляет функциональность, аналогичную [pkg\_resources](https://python-all.ru/3.10/library/importlib.html) [Базовый доступ к ресурсам](https://python-all.ru/3.10/library/importlib.html) без накладных расходов на производительность, присущих тому пакету. Это упрощает чтение ресурсов, входящих в состав пакетов, обеспечивая более стабильную и последовательную семантику.600>601> Автономный бэкпорт этого модуля предоставляет дополнительную информацию об [использовании importlib.resources](https://python-all.ru/3.10/library/importlib.html) и [миграции с pkg\_resources на importlib.resources](https://python-all.ru/3.10/library/importlib.html).602603Загрузчики, желающие поддерживать чтение ресурсов, должны реализовать метод `get_resource_reader(fullname)`, как указано в [`importlib.abc.ResourceReader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ResourceReader).604605Определены следующие типы.606607#### `importlib.resources.Package`608609Тип `Package` определён как `Union[str, ModuleType]`. Это означает, что там, где функция указывает, что принимает `Package`, можно передавать либо строку, либо модуль. Объекты модулей должны иметь разрешимый `__spec__.submodule_search_locations`, который не является `None`.610611#### `importlib.resources.Resource`612613Этот тип описывает имена ресурсов, передаваемые в различные функции этого пакета. Он определён как `Union[str, os.PathLike]`.614615Доступны следующие функции.616617#### `importlib.resources.files(package)`618619Возвращает объект [`importlib.abc.Traversable`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Traversable), представляющий контейнер ресурсов для пакета (аналог каталога) и его ресурсы (аналог файлов). Traversable может содержать другие контейнеры (аналог подкаталогов).620621*package* – это либо имя, либо объект модуля, соответствующий требованиям `Package`.622623Новое в версии 3.9.624625#### `importlib.resources.as_file(traversable)`626627Принимает объект [`importlib.abc.Traversable`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Traversable), представляющий файл (обычно из [`importlib.resources.files()`](https://python-all.ru/3.10/library/importlib.html#importlib.resources.files)), и возвращает менеджер контекста для использования в операторе [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with). Менеджер контекста предоставляет объект [`pathlib.Path`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path).628629Выход из менеджера контекста удаляет все временные файлы, созданные при извлечении ресурса, например, из zip-файла.630631Используйте `as_file`, когда методов Traversable (`read_text` и т. д.) недостаточно и требуется реальный файл в файловой системе.632633Новое в версии 3.9.634635#### `importlib.resources.open_binary(package, resource)`636637Открывает *ресурс* внутри *пакета* для двоичного чтения.638639*package* – это либо имя, либо объект модуля, соответствующий требованиям `Package`. *resource* – имя ресурса для открытия внутри *package*; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает экземпляр `typing.BinaryIO` – двоичный поток I/O, открытый для чтения.640641#### `importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict')`642643Открывает *ресурс* внутри *пакета* для текстового чтения. По умолчанию ресурс открывается для чтения в кодировке UTF-8.644645*package* – это либо имя, либо объект модуля, соответствующий требованиям `Package`. *resource* – имя ресурса для открытия внутри *package*; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). *encoding* и *errors* имеют то же значение, что и во встроенной [`open()`](https://python-all.ru/3.10/library/functions.html#open).646647Эта функция возвращает экземпляр `typing.TextIO` – текстовый поток I/O, открытый для чтения.648649#### `importlib.resources.read_binary(package, resource)`650651Читает и возвращает содержимое *ресурса* внутри *пакета* в виде `bytes`.652653*package* – это либо имя, либо объект модуля, соответствующий требованиям `Package`. *resource* – имя ресурса для открытия внутри *package*; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает содержимое ресурса в виде [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes).654655#### `importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict')`656657Читает и возвращает содержимое *ресурса* внутри *пакета* в виде `str`. По умолчанию содержимое читается как строгий UTF-8.658659*package* – это либо имя, либо объект модуля, соответствующий требованиям `Package`. *resource* – имя ресурса для открытия внутри *package*; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). *encoding* и *errors* имеют то же значение, что и во встроенной [`open()`](https://python-all.ru/3.10/library/functions.html#open). Эта функция возвращает содержимое ресурса в виде [`str`](https://python-all.ru/3.10/library/stdtypes.html#str).660661#### `importlib.resources.path(package, resource)`662663Возвращает путь к *ресурсу* в виде реального пути файловой системы. Эта функция возвращает менеджер контекста для использования в операторе [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with). Менеджер контекста предоставляет объект [`pathlib.Path`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path).664665При выходе из менеджера контекста удаляются все временные файлы, созданные при извлечении ресурса, например, из zip-файла.666667*package* – это либо имя, либо объект модуля, соответствующий требованиям `Package`. *resource* – имя ресурса для открытия внутри *package*; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом).668669#### `importlib.resources.is_resource(package, name)`670671Возвращает `True`, если в пакете есть ресурс с именем *name*, иначе `False`. Помните, что каталоги *не* являются ресурсами! *package* – это либо имя, либо объект модуля, который соответствует требованиям `Package`.672673#### `importlib.resources.contents(package)`674675Возвращает итератор по именованным элементам внутри пакета. Итератор возвращает [`str`](https://python-all.ru/3.10/library/stdtypes.html#str) ресурсы (например, файлы) и не-ресурсы (например, каталоги). Итератор не заходит в подкаталоги.676677*package* – это либо имя, либо объект модуля, соответствующий требованиям `Package`.678679## [`importlib.machinery`](https://python-all.ru/3.10/library/importlib.html#module-importlib.machinery) – Импортёры и перехватчики пути680681**Исходный код:** [Lib/importlib/machinery.py](https://python-all.ru/src/3.10/Lib/importlib/machinery.py)682683---684685Этот модуль содержит различные объекты, помогающие [`import`](https://python-all.ru/3.10/reference/simple_stmts.html#import) находить и загружать модули.686687#### `importlib.machinery.SOURCE_SUFFIXES`688689Список строк, представляющих распознаваемые расширения файлов для исходных модулей.690691Новое в версии 3.3.692693#### `importlib.machinery.DEBUG_BYTECODE_SUFFIXES`694695Список строк, представляющих расширения файлов для неоптимизированных байт-код модулей.696697Новое в версии 3.3.698699Устарело с версии 3.5: Используйте [`BYTECODE_SUFFIXES`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.BYTECODE_SUFFIXES) вместо.700701#### `importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES`702703Список строк с расширениями файлов для оптимизированных модулей байткода.704705Новое в версии 3.3.706707Устарело с версии 3.5: Используйте [`BYTECODE_SUFFIXES`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.BYTECODE_SUFFIXES) вместо.708709#### `importlib.machinery.BYTECODE_SUFFIXES`710711Список строк с распознаваемыми расширениями файлов для модулей байткода (включая начальную точку).712713Новое в версии 3.3.714715Изменено в версии 3.5: Значение больше не зависит от `__debug__`.716717#### `importlib.machinery.EXTENSION_SUFFIXES`718719Список строк с распознаваемыми расширениями файлов для модулей расширений.720721Новое в версии 3.3.722723#### `importlib.machinery.all_suffixes()`724725Возвращает объединённый список строк со всеми расширениями файлов для модулей, распознаваемых стандартным механизмом импорта. Это вспомогательная функция для кода, которому нужно лишь узнать, может ли путь файловой системы относиться к модулю, без необходимости в деталях о типе модуля (например, [`inspect.getmodulename()`](https://python-all.ru/3.10/library/inspect.html#inspect.getmodulename)).726727Новое в версии 3.3.728729#### `class importlib.machinery.BuiltinImporter`730731[Импортёр](https://python-all.ru/3.10/glossary.html#term-importer) для встроенных модулей. Все известные встроенные модули перечислены в [`sys.builtin_module_names`](https://python-all.ru/3.10/library/sys.html#sys.builtin_module_names). Этот класс реализует абстрактные базовые классы [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader).732733В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.734735Изменено в версии 3.5: В рамках [**PEP 489**](https://python-all.ru/3.10/library/importlib.html) встроенный импортёр теперь реализует `Loader.create_module()` и `Loader.exec_module()`.736737#### `class importlib.machinery.FrozenImporter`738739[Импортёр](https://python-all.ru/3.10/glossary.html#term-importer) для замороженных модулей. Этот класс реализует абстрактные базовые классы [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader).740741В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.742743Изменено в версии 3.4: Добавлены методы `create_module()` и `exec_module()`.744745#### `class importlib.machinery.WindowsRegistryFinder`746747[Finder](https://python-all.ru/3.10/glossary.html#term-finder) для модулей, объявленных в реестре Windows. Этот класс реализует абстрактный базовый класс [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder).748749В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.750751Новое в версии 3.3.752753Устарело с версии 3.6: Вместо этого используйте конфигурацию [`site`](https://python-all.ru/3.10/library/site.html#module-site). Будущие версии Python могут не включать этот искатель по умолчанию.754755#### `class importlib.machinery.PathFinder`756757[Искатель](https://python-all.ru/3.10/glossary.html#term-finder) для [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) и атрибутов пакета `__path__`. Этот класс реализует абстрактный базовый класс [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder).758759В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.760761#### `classmethod find_spec(fullname, path=None, target=None)`762763Метод класса, который пытается найти [спецификацию](https://python-all.ru/3.10/glossary.html#term-module-spec) для модуля, заданного *fullname* на [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) или, если определён, на *path*. Для каждого просматриваемого элемента пути проверяется [`sys.path_importer_cache`](https://python-all.ru/3.10/library/sys.html#sys.path_importer_cache). Если найден объект, не равный false, то он используется как [искатель элемента пути](https://python-all.ru/3.10/glossary.html#term-path-entry-finder) для поиска искомого модуля. Если элемент не найден в [`sys.path_importer_cache`](https://python-all.ru/3.10/library/sys.html#sys.path_importer_cache), то [`sys.path_hooks`](https://python-all.ru/3.10/library/sys.html#sys.path_hooks) ищется искатель для элемента пути, и если найден, сохраняется в [`sys.path_importer_cache`](https://python-all.ru/3.10/library/sys.html#sys.path_importer_cache), а также запрашивается о модуле. Если искатель так и не найден, то `None` сохраняется в кеше и возвращается.764765Новое в версии 3.4.766767Изменено в версии 3.5: Если текущая рабочая директория – представленная пустой строкой – больше не является допустимой, то возвращается `None`, но значение не кешируется в [`sys.path_importer_cache`](https://python-all.ru/3.10/library/sys.html#sys.path_importer_cache).768769#### `classmethod find_module(fullname, path=None)`770771Устаревшая обёртка для [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.PathFinder.find_spec).772773Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.PathFinder.find_spec).774775#### `classmethod invalidate_caches()`776777Вызывает [`importlib.abc.PathEntryFinder.invalidate_caches()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.invalidate_caches) на всех искателях, хранящихся в [`sys.path_importer_cache`](https://python-all.ru/3.10/library/sys.html#sys.path_importer_cache), которые определяют этот метод. В противном случае записи в [`sys.path_importer_cache`](https://python-all.ru/3.10/library/sys.html#sys.path_importer_cache), установленные в `None`, удаляются.778779Изменено в версии 3.7: Записи `None` в [`sys.path_importer_cache`](https://python-all.ru/3.10/library/sys.html#sys.path_importer_cache) удаляются.780781Изменено в версии 3.4: Вызывает объекты в [`sys.path_hooks`](https://python-all.ru/3.10/library/sys.html#sys.path_hooks), передавая текущую рабочую директорию в качестве `''` (т.е. пустую строку).782783#### `class importlib.machinery.FileFinder(path, *loader_details)`784785Конкретная реализация [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder), которая кеширует результаты из файловой системы.786787Аргумент *path* – это каталог, за поиск в котором отвечает искатель.788789Аргумент *loader\_details* – это переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознает. Загрузчики должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.790791Искатель будет кешировать содержимое каталога по мере необходимости, вызывая stat для каждого поиска модуля, чтобы убедиться, что кеш не устарел. Поскольку устаревание кеша зависит от гранулярности информации о состоянии файловой системы, предоставляемой операционной системой, существует потенциальное состояние гонки: поиск модуля, создание нового файла и последующий поиск модуля, который представляет этот новый файл. Если операции выполняются достаточно быстро, чтобы уложиться в гранулярность вызовов stat, поиск модуля завершится неудачей. Чтобы этого избежать, при динамическом создании модуля обязательно вызывайте [`importlib.invalidate_caches()`](https://python-all.ru/3.10/library/importlib.html#importlib.invalidate_caches).792793Новое в версии 3.3.794795#### `path`796797Путь, в котором будет искать искатель.798799#### `find_spec(fullname, target=None)`800801Пытается найти спецификацию для обработки *fullname* внутри [`path`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.FileFinder.path).802803Новое в версии 3.4.804805#### `find_loader(fullname)`806807Пытается найти загрузчик для *fullname* в [`path`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.FileFinder.path).808809Устарело с версии 3.10: используйте [`find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.FileFinder.find_spec) вместо этого.810811#### `invalidate_caches()`812813Очищает внутренний кеш.814815#### `classmethod path_hook(*loader_details)`816817Метод класса, возвращающий замыкание для использования в [`sys.path_hooks`](https://python-all.ru/3.10/library/sys.html#sys.path_hooks). Замыкание возвращает экземпляр [`FileFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.FileFinder), используя аргумент path, переданный непосредственно замыканию, и *loader\_details* косвенно.818819Если аргумент замыкания не является существующим каталогом, вызывается [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError).820821#### `class importlib.machinery.SourceFileLoader(fullname, path)`822823Конкретная реализация [`importlib.abc.SourceLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.SourceLoader) путём наследования от [`importlib.abc.FileLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.FileLoader) и предоставления конкретных реализаций других методов.824825Новое в версии 3.3.826827#### `name`828829Имя модуля, который будет обрабатывать этот загрузчик.830831#### `path`832833Путь к исходному файлу.834835#### `is_package(fullname)`836837Возвращает `True`, если [`path`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.SourceFileLoader.path), по-видимому, предназначен для пакета.838839#### `path_stats(path)`840841Конкретная реализация [`importlib.abc.SourceLoader.path_stats()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.SourceLoader.path_stats).842843#### `set_data(path, data)`844845Конкретная реализация [`importlib.abc.SourceLoader.set_data()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.SourceLoader.set_data).846847#### `load_module(name=None)`848849Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.850851Устарело с версии 3.6: Используйте [`importlib.abc.Loader.exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module) вместо.852853#### `class importlib.machinery.SourcelessFileLoader(fullname, path)`854855Конкретная реализация [`importlib.abc.FileLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.FileLoader), которая может импортировать файлы байт-кода (т.е. файлы исходного кода отсутствуют).856857Обратите внимание, что прямое использование файлов байт-кода (а не файлов исходного кода) препятствует тому, чтобы ваши модули могли использоваться всеми реализациями Python или новыми версиями Python, изменяющими формат байт-кода.858859Новое в версии 3.3.860861#### `name`862863Имя модуля, который будет обрабатывать загрузчик.864865#### `path`866867Путь к файлу байт-кода.868869#### `is_package(fullname)`870871Определяет, является ли модуль пакетом, на основе [`path`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).872873#### `get_code(fullname)`874875Возвращает объект кода для [`name`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.SourcelessFileLoader.name), созданный из [`path`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).876877#### `get_source(fullname)`878879Возвращает `None`, так как при использовании этого загрузчика файлы байт-кода не имеют исходного кода.880881#### `load_module(name=None)`882883Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.884885Устарело с версии 3.6: Используйте [`importlib.abc.Loader.exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module) вместо.886887#### `class importlib.machinery.ExtensionFileLoader(fullname, path)`888889Конкретная реализация [`importlib.abc.ExecutionLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.ExecutionLoader) для модулей-расширений.890891Аргумент *fullname* задаёт имя модуля, который должен поддерживать загрузчик. Аргумент *path* – это путь к файлу модуля-расширения.892893Новое в версии 3.3.894895#### `name`896897Имя модуля, который поддерживает загрузчик.898899#### `path`900901Путь к модулю-расширению.902903#### `create_module(spec)`904905Создаёт объект модуля из указанной спецификации в соответствии с [**PEP 489**](https://python-all.ru/3.10/library/importlib.html).906907Новое в версии 3.5.908909#### `exec_module(module)`910911Инициализирует указанный объект модуля в соответствии с [**PEP 489**](https://python-all.ru/3.10/library/importlib.html).912913Новое в версии 3.5.914915#### `is_package(fullname)`916917Возвращает `True`, если путь к файлу указывает на модуль `__init__` пакета на основе [`EXTENSION_SUFFIXES`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.EXTENSION_SUFFIXES).918919#### `get_code(fullname)`920921Возвращает `None`, так как у модулей-расширений нет объекта кода.922923#### `get_source(fullname)`924925Возвращает `None`, так как у модулей-расширений нет исходного кода.926927#### `get_filename(fullname)`928929Возвращает [`path`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.ExtensionFileLoader.path).930931Новое в версии 3.4.932933#### `class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)`934935Спецификация состояния модуля, связанного с системой импорта. Обычно она доступна как атрибут `__spec__` модуля. В описаниях ниже имена в скобках указывают соответствующий атрибут, доступный непосредственно у объекта модуля. Например, `module.__spec__.origin == module.__file__`. Однако обратите внимание, что хотя *значения* обычно эквивалентны, они могут различаться, поскольку между двумя объектами нет синхронизации. Таким образом, можно обновить `__path__` модуля во время выполнения, и это не будет автоматически отражено в `__spec__.submodule_search_locations`.936937Новое в версии 3.4.938939#### `name`940941(`__name__`)942943Строка с полным квалифицированным именем модуля.944945#### `loader`946947(`__loader__`)948949[Loader](https://python-all.ru/3.10/glossary.html#term-loader), который следует использовать при загрузке модуля. [Finders](https://python-all.ru/3.10/glossary.html#term-finder) должны всегда устанавливать его.950951#### `origin`952953(`__file__`)954955Имя места, из которого загружается модуль, например «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно «origin» должен быть установлен, но он может быть `None` (значение по умолчанию), что означает, что он не указан (например, для пространств имён пакетов).956957#### `submodule_search_locations`958959(`__path__`)960961Список строк, указывающих, где искать подмодули, если это пакет (иначе `None`).962963#### `loader_state`964965Контейнер дополнительных данных модуля для использования во время загрузки (или `None`).966967#### `cached`968969(`__cached__`)970971Строка, указывающая, где должен храниться скомпилированный модуль (или `None`).972973#### `parent`974975(`__package__`)976977(Только для чтения) Полное имя пакета, в котором модуль должен загружаться как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов совпадает с [`__name__`](https://python-all.ru/3.10/reference/import.html#name__).978979#### `has_location`980981Логическое значение, указывающее, относится ли атрибут «origin» модуля к загружаемому расположению.982983## [`importlib.util`](https://python-all.ru/3.10/library/importlib.html#module-importlib.util) – служебный код для импортёров984985**Исходный код:** [Lib/importlib/util.py](https://python-all.ru/src/3.10/Lib/importlib/util.py)986987---988989Этот модуль содержит различные объекты, помогающие в создании [импортёра](https://python-all.ru/3.10/glossary.html#term-importer).990991#### `importlib.util.MAGIC_NUMBER`992993Байты, представляющие номер версии байт-кода. Если требуется помощь в загрузке или записи байт-кода, рекомендуется использовать [`importlib.abc.SourceLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.SourceLoader).994995Новое в версии 3.4.996997#### `importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)`998999Возвращает путь [**PEP 3147**](https://python-all.ru/3.10/library/importlib.html)/[**PEP 488**](https://python-all.ru/3.10/library/importlib.html) к скомпилированному в байт-код файлу, связанному с исходным *path*. Например, если *path* – `/foo/bar/baz.py`, возвращаемым значением будет `/foo/bar/__pycache__/baz.cpython-32.pyc` для Python 3.2. Строка `cpython-32` берётся из текущего magic-тега (см. `get_tag()`; если `sys.implementation.cache_tag` не задан, то вызывается [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError)).10001001Параметр *optimization* используется для указания уровня оптимизации файла байт-кода. Пустая строка означает отсутствие оптимизации, поэтому `/foo/bar/baz.py` с *optimization*, равным `''`, приведёт к пути байт-кода `/foo/bar/__pycache__/baz.cpython-32.pyc`. `None` приводит к использованию уровня оптимизации интерпретатора. Строковое представление любого другого значения используется как есть, поэтому `/foo/bar/baz.py` с *optimization*, равным `2`, приведёт к пути байт-кода `/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc`. Строковое представление *optimization* может содержать только буквы и цифры, иначе вызывается [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError).10021003Параметр *debug\_override* устарел и может использоваться для переопределения системного значения `__debug__`. Значение `True` эквивалентно установке *optimization* в пустую строку. Значение `False` аналогично установке *optimization* в `1`. Если оба *debug\_override* и *optimization* не равны `None`, то вызывается [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError).10041005Новое в версии 3.4.10061007Изменено в версии 3.5: Был добавлен параметр *optimization*, а параметр *debug\_override* был объявлен устаревшим.10081009Изменено в версии 3.6: Принимает [объект, подобный пути](https://python-all.ru/3.10/glossary.html#term-path-like-object).10101011#### `importlib.util.source_from_cache(path)`10121013По заданному *path* для имени файла [**PEP 3147**](https://python-all.ru/3.10/library/importlib.html) возвращает связанный путь к файлу исходного кода. Например, если *path* равен `/foo/bar/__pycache__/baz.cpython-32.pyc`, возвращаемый путь будет `/foo/bar/baz.py`. *path* необязательно должен существовать, однако если он не соответствует формату [**PEP 3147**](https://python-all.ru/3.10/library/importlib.html) или [**PEP 488**](https://python-all.ru/3.10/library/importlib.html), вызывается [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError). Если `sys.implementation.cache_tag` не определён, вызывается [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError).10141015Новое в версии 3.4.10161017Изменено в версии 3.6: Принимает [объект, подобный пути](https://python-all.ru/3.10/glossary.html#term-path-like-object).10181019#### `importlib.util.decode_source(source_bytes)`10201021Декодирует заданные байты, представляющие исходный код, и возвращает их в виде строки с универсальными символами новой строки (как требуется в [`importlib.abc.InspectLoader.get_source()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader.get_source)).10221023Новое в версии 3.4.10241025#### `importlib.util.resolve_name(name, package)`10261027Преобразует относительное имя модуля в абсолютное.10281029Если **name** не содержит ведущих точек, то **name** просто возвращается. Это позволяет использовать такие конструкции, как `importlib.util.resolve_name('sys', __spec__.parent)`, без проверки того, требуется ли аргумент **package**.10301031[`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) возбуждается, если **name** – относительное имя модуля, но **package** – ложное значение (например, `None` или пустая строка). [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) также возбуждается, если относительное имя выходит за пределы содержащего пакета (например, запрос `..bacon` изнутри пакета `spam`).10321033Новое в версии 3.3.10341035Изменено в версии 3.9: Для повышения согласованности с инструкциями import теперь вызывается [`ImportError`](https://python-all.ru/3.10/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError) при недопустимых попытках относительного импорта.10361037#### `importlib.util.find_spec(name, package=None)`10381039Находит [spec](https://python-all.ru/3.10/glossary.html#term-module-spec) для модуля, возможно, относительно указанного имени **package**. Если модуль находится в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules), возвращается `sys.modules[name].__spec__` (если только spec не будет `None` или не задан, и в этом случае вызывается [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError)). В противном случае выполняется поиск с помощью [`sys.meta_path`](https://python-all.ru/3.10/library/sys.html#sys.meta_path). `None` возвращается, если spec не найден.10401041Если **name** относится к подмодулю (содержит точку), родительский модуль импортируется автоматически.10421043**name** и **package** работают так же, как для `import_module()`.10441045Новое в версии 3.4.10461047Изменено в версии 3.7: Вызывает [`ModuleNotFoundError`](https://python-all.ru/3.10/library/exceptions.html#ModuleNotFoundError) вместо [`AttributeError`](https://python-all.ru/3.10/library/exceptions.html#AttributeError), если **package** на самом деле не является пакетом (т.е. не имеет атрибута [`__path__`](https://python-all.ru/3.10/reference/import.html#path__) ).10481049#### `importlib.util.module_from_spec(spec)`10501051Создаёт новый модуль на основе **spec** и [`spec.loader.create_module`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.create_module).10521053Если [`spec.loader.create_module`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.create_module) не возвращает `None`, то любые существующие атрибуты не будут сброшены. Кроме того, [`AttributeError`](https://python-all.ru/3.10/library/exceptions.html#AttributeError) не будет вызвано, если оно сработает при доступе к **spec** или установке атрибута модуля.10541055Эта функция предпочтительнее использования [`types.ModuleType`](https://python-all.ru/3.10/library/types.html#types.ModuleType) для создания нового модуля, так как **spec** используется для установки как можно большего количества атрибутов, управляемых импортом, на модуле.10561057Новое в версии 3.5.10581059#### `@importlib.util.module_for_loader`10601061[Декоратор](https://python-all.ru/3.10/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module) для выбора подходящего объекта модуля для загрузки. Ожидается, что декорируемый метод имеет сигнатуру вызова с двумя позиционными аргументами (например, `load_module(self, module)`), второй из которых будет объектом **модуля** для использования загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами из-за предположения о двух аргументах.10621063Декорируемый метод будет принимать **имя** модуля для загрузки, как и ожидается для [загрузчика](https://python-all.ru/3.10/glossary.html#term-loader). Если модуль не найден в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules), то создается новый. Независимо от того, откуда взялся модуль, [`__loader__`](https://python-all.ru/3.10/reference/import.html#loader__) устанавливается в **self**, а [`__package__`](https://python-all.ru/3.10/reference/import.html#package__) устанавливается на основе того, что возвращает [`importlib.abc.InspectLoader.is_package()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.InspectLoader.is_package) (если доступно). Эти атрибуты устанавливаются безусловно для поддержки перезагрузки.10641065Если декорируемый метод вызывает исключение, а модуль был добавлен в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules), то модуль будет удален, чтобы предотвратить оставление частично инициализированного модуля в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules). Если модуль уже был в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules), то он остается без изменений.10661067Изменено в версии 3.3: [`__loader__`](https://python-all.ru/3.10/reference/import.html#loader__) и [`__package__`](https://python-all.ru/3.10/reference/import.html#package__) автоматически устанавливаются (когда это возможно).10681069Изменено в версии 3.4: Устанавливает [`__name__`](https://python-all.ru/3.10/reference/import.html#name__), [`__loader__`](https://python-all.ru/3.10/reference/import.html#loader__) [`__package__`](https://python-all.ru/3.10/reference/import.html#package__) безусловно для поддержки перезагрузки.10701071Устарело с версии 3.4: Механизм импорта теперь напрямую выполняет все функции, предоставляемые этой функцией.10721073#### `@importlib.util.set_loader`10741075[Декоратор](https://python-all.ru/3.10/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module) для установки атрибута [`__loader__`](https://python-all.ru/3.10/reference/import.html#loader__) на возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обернутого метода (т.е. `self`) – это то, на что должно быть установлено [`__loader__`](https://python-all.ru/3.10/reference/import.html#loader__).10761077Изменено в версии 3.4: Устанавливает `__loader__`, если установлен в `None`, как если бы атрибут не существовал.10781079Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.10801081#### `@importlib.util.set_package`10821083[Декоратор](https://python-all.ru/3.10/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module) для установки атрибута [`__package__`](https://python-all.ru/3.10/reference/import.html#package__) на возвращаемом модуле. Если [`__package__`](https://python-all.ru/3.10/reference/import.html#package__) установлен и имеет значение, отличное от `None`, он не будет изменен.10841085Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.10861087#### `importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)`10881089Фабричная функция для создания экземпляра [`ModuleSpec`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.ModuleSpec) на основе загрузчика. Параметры имеют тот же смысл, что и для ModuleSpec. Функция использует доступные [loader](https://python-all.ru/3.10/glossary.html#term-loader) API, такие как `InspectLoader.is_package()`, для заполнения недостающей информации о spec.10901091Новое в версии 3.4.10921093#### `importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)`10941095Фабричная функция для создания экземпляра [`ModuleSpec`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.ModuleSpec) на основе пути к файлу. Недостающая информация будет заполнена в спецификации с помощью API загрузчика и исходя из того, что модуль будет файловым.10961097Новое в версии 3.4.10981099Изменено в версии 3.6: Принимает [объект, подобный пути](https://python-all.ru/3.10/glossary.html#term-path-like-object).11001101#### `importlib.util.source_hash(source_bytes)`11021103Возвращает хеш *source\_bytes* в виде байтов. Файл `.pyc` на основе хеша включает [`source_hash()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.source_hash) содержимого соответствующего исходного файла в свой заголовок.11041105Добавлено в версии 3.7.11061107#### `class importlib.util.LazyLoader(loader)`11081109Класс, который откладывает выполнение загрузчика модуля до момента обращения к атрибуту модуля.11101111Этот класс **работает только** с загрузчиками, которые определяют [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module), так как требуется контроль над типом модуля, используемого для модуля. По тем же причинам метод [`create_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.create_module) загрузчика должен возвращать `None` или тип, чей атрибут `__class__` можно изменять, а также не использовать [slots](https://python-all.ru/3.10/glossary.html#term-__slots__). Наконец, модули, подменяющие объект, помещённый в [`sys.modules`](https://python-all.ru/3.10/library/sys.html#sys.modules), работать не будут, поскольку невозможно безопасно заменить ссылки на модуль во всём интерпретаторе; если такая подмена обнаружена, возбуждается [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError).11121113> **Примечание**1114>1115> Для проектов, где время запуска критично, этот класс позволяет минимизировать затраты на загрузку модуля, если он никогда не используется. Для проектов, где время запуска несущественно, использование этого класса **настоятельно** не рекомендуется, поскольку сообщения об ошибках, возникающие при загрузке, откладываются и появляются вне контекста.11161117Новое в версии 3.5.11181119Изменено в версии 3.6: Начался вызов [`create_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.create_module), удалено предупреждение о совместимости для [`importlib.machinery.BuiltinImporter`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.BuiltinImporter) и [`importlib.machinery.ExtensionFileLoader`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.ExtensionFileLoader).11201121#### `classmethod factory(loader)`11221123Метод класса, возвращающий вызываемый объект, который создаёт ленивый загрузчик. Предназначен для использования в ситуациях, когда загрузчик передаётся по классу, а не по экземпляру.11241125```python1126suffixes = importlib.machinery.SOURCE_SUFFIXES1127loader = importlib.machinery.SourceFileLoader1128lazy_loader = importlib.util.LazyLoader.factory(loader)1129finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))1130```11311132## Примеры11331134### Программный импорт11351136Для программного импорта модуля используйте [`importlib.import_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.import_module).11371138```python1139import importlib11401141itertools = importlib.import_module('itertools')1142```11431144### Проверка возможности импорта модуля11451146Если нужно узнать, можно ли импортировать модуль, не выполняя сам импорт, следует использовать [`importlib.util.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.find_spec).11471148Обратите внимание: если `name` является подмодулем (содержит точку), [`importlib.util.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.find_spec) импортирует родительский модуль.11491150```python1151import importlib.util1152import sys11531154# Для наглядности.1155name = 'itertools'11561157if name in sys.modules:1158 print(f"{name!r} already in sys.modules")1159elif (spec := importlib.util.find_spec(name)) is not None:1160 # Если требуется выполнить фактический импорт ...1161 module = importlib.util.module_from_spec(spec)1162 sys.modules[name] = module1163 spec.loader.exec_module(module)1164 print(f"{name!r} has been imported")1165else:1166 print(f"can't find the {name!r} module")1167```11681169### Прямой импорт исходного файла11701171Чтобы напрямую импортировать исходный файл Python, используйте следующий рецепт (только Python 3.5 и новее):11721173```python1174import importlib.util1175import sys11761177# Для наглядности.1178import tokenize1179file_path = tokenize.__file__1180module_name = tokenize.__name__11811182spec = importlib.util.spec_from_file_location(module_name, file_path)1183module = importlib.util.module_from_spec(spec)1184sys.modules[module_name] = module1185spec.loader.exec_module(module)1186```11871188### Реализация ленивого импорта11891190Пример ниже показывает, как реализовать ленивый импорт:11911192```python1193>>> import importlib.util1194>>> import sys1195>>> def lazy_import(name):1196... spec = importlib.util.find_spec(name)1197... loader = importlib.util.LazyLoader(spec.loader)1198... spec.loader = loader1199... module = importlib.util.module_from_spec(spec)1200... sys.modules[name] = module1201... loader.exec_module(module)1202... return module1203...1204>>> lazy_typing = lazy_import("typing")1205>>> #lazy_typing – это реальный объект модуля,1206>>> #но он ещё не загружен в память.1207>>> lazy_typing.TYPE_CHECKING1208False1209```12101211### Настройка импортёра12121213Для глубокой настройки импорта обычно требуется реализовать [импортёр](https://python-all.ru/3.10/glossary.html#term-importer). Это означает управление как [поисковиком](https://python-all.ru/3.10/glossary.html#term-finder), так и [загрузчиком](https://python-all.ru/3.10/glossary.html#term-loader). Для поисковиков есть два варианта в зависимости от потребностей: [поисковик по мета-пути](https://python-all.ru/3.10/glossary.html#term-meta-path-finder) или [поисковик по записям пути](https://python-all.ru/3.10/glossary.html#term-path-entry-finder). Первый помещается в [`sys.meta_path`](https://python-all.ru/3.10/library/sys.html#sys.meta_path), а второй создаётся с помощью [хука записи пути](https://python-all.ru/3.10/glossary.html#term-path-entry-hook) на [`sys.path_hooks`](https://python-all.ru/3.10/library/sys.html#sys.path_hooks), который работает с записями [`sys.path`](https://python-all.ru/3.10/library/sys.html#sys.path) для потенциального создания поисковика. Этот пример покажет, как зарегистрировать собственные импортёры, чтобы импорт их использовал (для создания своего импортёра прочтите документацию по соответствующим классам, определённым в этом пакете):12141215```python1216import importlib.machinery1217import sys12181219# Только для наглядности.1220SpamMetaPathFinder = importlib.machinery.PathFinder1221SpamPathEntryFinder = importlib.machinery.FileFinder1222loader_details = (importlib.machinery.SourceFileLoader,1223 importlib.machinery.SOURCE_SUFFIXES)12241225# Настройка искателя мета-пути.1226# Убедитесь, что искатель помещён в правильное место в списке с точки зрения1227# приоритета.1228sys.meta_path.append(SpamMetaPathFinder)12291230# Настройка искателя точек входа пути.1231# Убедитесь, что хук пути помещён в правильное место в списке с точки зрения1232# приоритета.1233sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))1234```12351236### Аппроксимация [`importlib.import_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.import_module)12371238Сам импорт реализован на Python, что позволяет предоставить доступ к большей части механизма импорта через importlib. Следующий пример иллюстрирует различные API, которые предоставляет importlib, приводя приблизительную реализацию [`importlib.import_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.import_module) (Python 3.4 и новее для использования importlib, Python 3.6 и новее для остальных частей кода).12391240```python1241import importlib.util1242import sys12431244def import_module(name, package=None):1245 """Примерная реализация импорта."""1246 absolute_name = importlib.util.resolve_name(name, package)1247 try:1248 return sys.modules[absolute_name]1249 except KeyError:1250 pass12511252 path = None1253 if '.' in absolute_name:1254 parent_name, _, child_name = absolute_name.rpartition('.')1255 parent_module = import_module(parent_name)1256 path = parent_module.__spec__.submodule_search_locations1257 for finder in sys.meta_path:1258 spec = finder.find_spec(absolute_name, path)1259 if spec is not None:1260 break1261 else:1262 msg = f'No module named {absolute_name!r}'1263 raise ModuleNotFoundError(msg, name=absolute_name)1264 module = importlib.util.module_from_spec(spec)1265 sys.modules[absolute_name] = module1266 spec.loader.exec_module(module)1267 if path is not None:1268 setattr(parent_module, child_name, module)1269 return module1270```1271