importlib.md
1> **Источник:** https://python-all.ru/3.13/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.13/Lib/importlib/__init__.py)1213---1415## Введение1617Пакет `importlib` преследует три цели.1819Первая – предоставить реализацию оператора [`import`](https://python-all.ru/3.13/reference/simple_stmts.html#import) (и, соответственно, функции [`__import__()`](https://python-all.ru/3.13/library/functions.html#import__)) на Python. Это даёт реализацию `import`, переносимую на любой интерпретатор Python. Кроме того, такую реализацию проще понять, чем написанную на другом языке программирования.2021Вторая – в этом пакете предоставлены компоненты для реализации [`import`](https://python-all.ru/3.13/reference/simple_stmts.html#import), что упрощает пользователям создание собственных объектов (обобщённо называемых [importer](https://python-all.ru/3.13/glossary.html#term-importer)) для участия в процессе импорта.2223Третья – пакет содержит модули, предоставляющие дополнительные возможности для управления аспектами пакетов Python:2425- [`importlib.metadata`](https://python-all.ru/3.13/library/importlib.metadata.html#module-importlib.metadata) предоставляет доступ к метаданным сторонних дистрибутивов.26- [`importlib.resources`](https://python-all.ru/3.13/library/importlib.resources.html#module-importlib.resources) предоставляет функции для доступа к «ресурсам» (не коду) из пакетов Python.2728> **См. также**29>30> **[Оператор import](https://python-all.ru/3.13/reference/simple_stmts.html#import)**31>32> Справочник по языку для оператора [`import`](https://python-all.ru/3.13/reference/simple_stmts.html#import).33>34> **[Спецификация пакетов](https://python-all.ru/3.13/library/importlib.html)**35>36> Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе `None` в [`sys.modules`](https://python-all.ru/3.13/library/sys.html#sys.modules)).37>38> **Функция [`__import__()`](https://python-all.ru/3.13/library/importlib.html#importlib.__import__)**39>40> Оператор [`import`](https://python-all.ru/3.13/reference/simple_stmts.html#import) – это синтаксический сахар для этой функции.41>42> **[Инициализация пути поиска модулей sys.path](https://python-all.ru/3.13/library/sys_path_init.html#sys-path-init)**43>44> Инициализация [`sys.path`](https://python-all.ru/3.13/library/sys.html#sys.path).45>46> **[**PEP 235**](https://python-all.ru/3.13/library/importlib.html)**47>48> Импорт на платформах, нечувствительных к регистру49>50> **[**PEP 263**](https://python-all.ru/3.13/library/importlib.html)**51>52> Определение кодировок исходного кода Python53>54> **[**PEP 302**](https://python-all.ru/3.13/library/importlib.html)**55>56> Новые хуки импорта57>58> **[**PEP 328**](https://python-all.ru/3.13/library/importlib.html)**59>60> Импорт: многострочный и абсолютный/относительный61>62> **[**PEP 366**](https://python-all.ru/3.13/library/importlib.html)**63>64> Явные относительные импорты в главном модуле65>66> **[**PEP 420**](https://python-all.ru/3.13/library/importlib.html)**67>68> Неявные пакеты пространств имён69>70> **[**PEP 451**](https://python-all.ru/3.13/library/importlib.html)**71>72> Тип ModuleSpec для системы импорта73>74> **[**PEP 488**](https://python-all.ru/3.13/library/importlib.html)**75>76> Устранение PYO-файлов77>78> **[**PEP 489**](https://python-all.ru/3.13/library/importlib.html)**79>80> Многофазная инициализация модулей расширения81>82> **[**PEP 552**](https://python-all.ru/3.13/library/importlib.html)**83>84> Детерминированные pyc-файлы85>86> **[**PEP 3120**](https://python-all.ru/3.13/library/importlib.html)**87>88> Использование UTF-8 в качестве кодировки исходного кода по умолчанию89>90> **[**PEP 3147**](https://python-all.ru/3.13/library/importlib.html)**91>92> Каталоги репозитория PYC9394## Функции9596#### `importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)`9798Реализация встроенной функции `__import__()`.99100> **Примечание**101>102> Для программного импорта модулей следует использовать [`import_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.import_module) вместо данной функции.103104#### `importlib.import_module(name, package=None)`105106Импортирует модуль. Аргумент *name* задаёт импортируемый модуль в абсолютном или относительном выражении (например, `pkg.mod` или `..mod`). Если имя задано в относительном выражении, то аргумент *package* должен быть установлен в имя пакета, который будет служить якорем для разрешения имени пакета (например, `import_module('..mod', 'pkg.subpkg')` импортирует `pkg.mod`).107108Функция `import_module()` действует как упрощающая обёртка вокруг [`importlib.__import__()`](https://python-all.ru/3.13/library/importlib.html#importlib.__import__). Это означает, что вся семантика функции проистекает из `importlib.__import__()`. Самое важное различие между этими двумя функциями заключается в том, что `import_module()` возвращает указанный пакет или модуль (например, `pkg.mod`), а [`__import__()`](https://python-all.ru/3.13/library/functions.html#import__) возвращает корневой пакет или модуль (например, `pkg`).109110При динамическом импорте модуля, созданного после запуска интерпретатора (например, создан Python-файл), может потребоваться вызов [`invalidate_caches()`](https://python-all.ru/3.13/library/importlib.html#importlib.invalidate_caches), чтобы новый модуль был замечен системой импорта.111112Изменено в версии 3.3: Родительские пакеты импортируются автоматически.113114#### `importlib.invalidate_caches()`115116Инвалидирует внутренние кеши искателей, хранящиеся в [`sys.meta_path`](https://python-all.ru/3.13/library/sys.html#sys.meta_path). Если искатель реализует `invalidate_caches()`, то он будет вызван для выполнения инвалидации. Эту функцию следует вызывать при создании или установке любых модулей во время работы программы, чтобы гарантировать, что все искатели заметят существование нового модуля.117118Добавлено в версии 3.3.119120Изменено в версии 3.10: Пакеты пространств имён, созданные или установленные в другом расположении [`sys.path`](https://python-all.ru/3.13/library/sys.html#sys.path) после того, как то же пространство имён уже было импортировано, теперь обнаруживаются.121122#### `importlib.reload(module)`123124Перезагружает ранее импортированный *модуль*. Аргумент должен быть объектом модуля, то есть он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля во внешнем редакторе и хотите опробовать новую версию, не выходя из интерпретатора Python. Возвращаемое значение – объект модуля (который может отличаться, если повторный импорт помещает другой объект в [`sys.modules`](https://python-all.ru/3.13/library/sys.html#sys.modules)).125126Когда выполняется `reload()`:127128- Код модуля Python перекомпилируется, а код уровня модуля выполняется заново, создавая новый набор объектов, которые привязываются к именам в словаре модуля путём повторного использования [загрузчика](https://python-all.ru/3.13/glossary.html#term-loader), который изначально загрузил модуль. Функция `init` модулей расширения не вызывается повторно.129- Как и все другие объекты в Python, старые объекты освобождаются только после того, как счётчики ссылок на них упадут до нуля.130- Имена в пространстве имён модуля обновляются, чтобы указывать на новые или изменённые объекты.131- Другие ссылки на старые объекты (например, имена вне модуля) не перепривязываются для указания на новые объекты и должны быть обновлены в каждом пространстве имён, где они встречаются, если это необходимо.132133Существует ряд других предостережений:134135При перезагрузке модуля его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имён заменяют старые определения, так что это обычно не проблема. Если новая версия модуля не определяет имя, которое было определено старой версией, старое определение сохраняется. Эта возможность может быть использована в пользу модуля, если он поддерживает глобальную таблицу или кеш объектов – с помощью оператора [`try`](https://python-all.ru/3.13/reference/compound_stmts.html#try) можно проверить наличие таблицы и пропустить её инициализацию, если требуется:136137```python138try:139 cache140except NameError:141 cache = {}142```143144Перезагружать встроенные или динамически загружаемые модули обычно не очень полезно. Перезагрузка [`sys`](https://python-all.ru/3.13/library/sys.html#module-sys), [`__main__`](https://python-all.ru/3.13/library/__main__.html#module-__main__), [`builtins`](https://python-all.ru/3.13/library/builtins.html#module-builtins) и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не рассчитаны на инициализацию более одного раза и могут отказывать непредсказуемым образом при перезагрузке.145146Если модуль импортирует объекты из другого модуля с помощью [`from`](https://python-all.ru/3.13/reference/simple_stmts.html#from) … [`import`](https://python-all.ru/3.13/reference/simple_stmts.html#import) …, вызов `reload()` для другого модуля не переопределяет импортированные из него объекты – один из способов обойти это – повторно выполнить оператор `from`, другой – использовать `import` и полные имена (*module.name*) вместо этого.147148Если модуль создаёт экземпляры класса, перезагрузка модуля, в котором определён класс, не влияет на определения методов этих экземпляров – они продолжают использовать старое определение класса. То же самое верно и для производных классов.149150Добавлено в версии 3.4.151152Изменено в версии 3.7: [`ModuleNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#ModuleNotFoundError) возникает, когда перезагружаемый модуль не имеет [`ModuleSpec`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ModuleSpec).153154> **Предупреждение**155>156> Эта функция не является потокобезопасной. Вызов её из нескольких потоков может привести к непредсказуемому поведению. Рекомендуется использовать [`threading.Lock`](https://python-all.ru/3.13/library/threading.html#threading.Lock) или другие примитивы синхронизации для потокобезопасной перезагрузки модулей.157158## `importlib.abc` – абстрактные базовые классы, связанные с импортом159160**Исходный код:** [Lib/importlib/abc.py](https://python-all.ru/src/3.13/Lib/importlib/abc.py)161162---163164Модуль `importlib.abc` содержит все основные абстрактные базовые классы, используемые [`import`](https://python-all.ru/3.13/reference/simple_stmts.html#import). Также предоставляются некоторые подклассы основных абстрактных базовых классов, помогающие в реализации основных ABC.165166Иерархия ABC:167168```python169object170 +-- MetaPathFinder171 +-- PathEntryFinder172 +-- Loader173 +-- ResourceLoader --------+174 +-- InspectLoader |175 +-- ExecutionLoader --+176 +-- FileLoader177 +-- SourceLoader178```179180#### `class importlib.abc.MetaPathFinder`181182Абстрактный базовый класс, представляющий [мета-искатель путей](https://python-all.ru/3.13/glossary.html#term-meta-path-finder).183184Добавлено в версии 3.3.185186Изменено в версии 3.10: Больше не является подклассом `Finder`.187188#### `find_spec(fullname, path, target=None)`189190Абстрактный метод для поиска [спецификации](https://python-all.ru/3.13/glossary.html#term-module-spec) для указанного модуля. Если это импорт верхнего уровня, *path* будет `None`. В противном случае это поиск подпакета или модуля, и *path* будет значением [`__path__`](https://python-all.ru/3.13/reference/datamodel.html#module.__path__) из родительского пакета. Если спецификацию не удаётся найти, возвращается `None`. При передаче `target` является объектом модуля, который искатель может использовать для более обоснованного предположения о том, какую спецификацию вернуть. [`importlib.util.spec_from_loader()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.spec_from_loader) может быть полезен для реализации конкретных `MetaPathFinders`.191192Добавлено в версии 3.4.193194#### `invalidate_caches()`195196Необязательный метод, который при вызове должен инвалидировать любой внутренний кеш, используемый искателем. Используется [`importlib.invalidate_caches()`](https://python-all.ru/3.13/library/importlib.html#importlib.invalidate_caches) при инвалидации кешей всех искателей на [`sys.meta_path`](https://python-all.ru/3.13/library/sys.html#sys.meta_path).197198Изменено в версии 3.4: Возвращает `None` при вызове вместо [`NotImplemented`](https://python-all.ru/3.13/library/constants.html#NotImplemented).199200#### `class importlib.abc.PathEntryFinder`201202Абстрактный базовый класс, представляющий [искатель записей путей](https://python-all.ru/3.13/glossary.html#term-path-entry-finder). Хотя он имеет некоторое сходство с [`MetaPathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder), `PathEntryFinder` предназначен для использования только внутри подсистемы импорта на основе путей, предоставляемой [`importlib.machinery.PathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.PathFinder).203204Добавлено в версии 3.3.205206Изменено в версии 3.10: Больше не является подклассом `Finder`.207208#### `find_spec(fullname, target=None)`209210Абстрактный метод для поиска [спецификации](https://python-all.ru/3.13/glossary.html#term-module-spec) для указанного модуля. Искатель будет искать модуль только в пределах той [записи пути](https://python-all.ru/3.13/glossary.html#term-path-entry), к которой он привязан. Если спецификацию не удаётся найти, возвращается `None`. При передаче `target` является объектом модуля, который искатель может использовать для более обоснованного предположения о том, какую спецификацию вернуть. [`importlib.util.spec_from_loader()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.spec_from_loader) может быть полезен для реализации конкретных `PathEntryFinders`.211212Добавлено в версии 3.4.213214#### `invalidate_caches()`215216Необязательный метод, который при вызове должен инвалидировать любой внутренний кеш, используемый искателем. Используется [`importlib.machinery.PathFinder.invalidate_caches()`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.PathFinder.invalidate_caches) при инвалидации кешей всех кешированных искателей.217218#### `class importlib.abc.Loader`219220Абстрактный базовый класс для [загрузчика](https://python-all.ru/3.13/glossary.html#term-loader). См. [**PEP 302**](https://python-all.ru/3.13/library/importlib.html) для точного определения загрузчика.221222Загрузчики, желающие поддерживать чтение ресурсов, должны реализовать метод `get_resource_reader()`, как указано в [`importlib.resources.abc.ResourceReader`](https://python-all.ru/3.13/library/importlib.resources.abc.html#importlib.resources.abc.ResourceReader).223224Изменено в версии 3.7: Введён необязательный метод `get_resource_reader()`.225226#### `create_module(spec)`227228Метод, который возвращает объект модуля для использования при импорте модуля. Этот метод может вернуть `None`, что означает, что должна применяться семантика создания модуля по умолчанию.229230Добавлено в версии 3.4.231232Изменено в версии 3.6: Этот метод больше не является необязательным, если определён [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module).233234#### `exec_module(module)`235236Абстрактный метод, который выполняет модуль в его собственном пространстве имён при импорте или перезагрузке модуля. Модуль должен уже быть инициализирован к моменту вызова `exec_module()`. Если этот метод существует, [`create_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.create_module) должен быть определён.237238Добавлено в версии 3.4.239240Изменено в версии 3.6: [`create_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.create_module) также должен быть определён.241242#### `load_module(fullname)`243244Устаревший метод для загрузки модуля. Если модуль не может быть загружен, возбуждается [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError), иначе возвращается загруженный модуль.245246Если запрошенный модуль уже существует в [`sys.modules`](https://python-all.ru/3.13/library/sys.html#sys.modules), этот модуль следует использовать и перезагрузить. В противном случае загрузчику следует создать новый модуль и вставить его в `sys.modules` до начала любой загрузки, чтобы предотвратить рекурсию при импорте. Если загрузчик вставил модуль, а загрузка завершилась неудачей, загрузчик должен удалить его из `sys.modules`; модули, уже находившиеся в `sys.modules` до начала выполнения загрузчика, следует оставить без изменений.247248Загрузчик должен установить несколько атрибутов модуля (обратите внимание, что некоторые из этих атрибутов могут измениться при перезагрузке модуля):249250- [`module.__name__`](https://python-all.ru/3.13/reference/datamodel.html#module.__name__)251- [`module.__file__`](https://python-all.ru/3.13/reference/datamodel.html#module.__file__)252- [`module.__cached__`](https://python-all.ru/3.13/reference/datamodel.html#module.__cached__) *(устарело)*253- [`module.__path__`](https://python-all.ru/3.13/reference/datamodel.html#module.__path__)254- [`module.__package__`](https://python-all.ru/3.13/reference/datamodel.html#module.__package__) *(устарело)*255- [`module.__loader__`](https://python-all.ru/3.13/reference/datamodel.html#module.__loader__) *(устарело)*256257Если [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module) доступен, то предоставляется обратно совместимая функциональность.258259Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) при вызове вместо [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError). Функциональность предоставляется, когда доступен [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module).260261Устарело с версии 3.4, будет удалено в версии 3.15: Рекомендуемый API для загрузки модуля – [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module) (и [`create_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.create_module)). Загрузчики должны реализовывать его вместо `load_module()`. Механизм импорта берёт на себя все остальные обязанности `load_module()`, когда реализован `exec_module()`.262263#### `class importlib.abc.ResourceLoader`264265*Заменено на TraversableResources*266267> Абстрактный базовый класс для [загрузчика](https://python-all.ru/3.13/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.13/library/importlib.html) для загрузки произвольных ресурсов из бэкенда хранилища.268>269> Устарело с версии 3.7: Этот ABC устарел в пользу поддержки загрузки ресурсов через [`importlib.resources.abc.TraversableResources`](https://python-all.ru/3.13/library/importlib.resources.abc.html#importlib.resources.abc.TraversableResources).270>271> #### `abstractmethod get_data(path)`272>273> > Абстрактный метод, возвращающий байты данных, находящихся по *пути*. Загрузчики, имеющие бэкенд хранения, подобный файловому, позволяющий хранить произвольные данные, могут реализовать этот абстрактный метод для предоставления прямого доступа к хранимым данным. [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) должен быть возбуждён, если *путь* не может быть найден. Ожидается, что *путь* будет построен с использованием атрибута [`__file__`](https://python-all.ru/3.13/reference/datamodel.html#module.__file__) модуля или элемента из [`__path__`](https://python-all.ru/3.13/reference/datamodel.html#module.__path__) пакета.274> >275> > Изменено в версии 3.4: возбуждает [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).276277#### `class importlib.abc.InspectLoader`278279Абстрактный базовый класс для [загрузчика](https://python-all.ru/3.13/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.13/library/importlib.html) для загрузчиков, которые инспектируют модули.280281#### `get_code(fullname)`282283Возвращает объект кода для модуля или `None`, если модуль не имеет объекта кода (как, например, для встроенного модуля). Возбуждает [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError), если загрузчик не может найти запрошенный модуль.284285> **Примечание**286>287> Хотя метод имеет реализацию по умолчанию, рекомендуется переопределить его, если это возможно для повышения производительности.288289Изменено в версии 3.4: Больше не является абстрактным, предоставлена конкретная реализация.290291#### `abstractmethod get_source(fullname)`292293> Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием [универсальных символов новой строки](https://python-all.ru/3.13/glossary.html#term-universal-newlines), преобразуя все распознанные разделители строк в символы `'\n'`. Возвращает `None`, если исходный код недоступен (например, для встроенного модуля). Возбуждает [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError), если загрузчик не может найти указанный модуль.294>295> Изменено в версии 3.4: возбуждает [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).296297#### `is_package(fullname)`298299Необязательный метод, возвращающий истинное значение, если модуль является пакетом, и ложное в противном случае. [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) возбуждается, если [загрузчик](https://python-all.ru/3.13/glossary.html#term-loader) не может найти модуль.300301Изменено в версии 3.4: возбуждает [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).302303#### `static source_to_code(data, path='<string>')`304305Создаёт объект кода из исходного кода Python.306307Аргумент *data* может быть любым значением, которое поддерживает функция [`compile()`](https://python-all.ru/3.13/library/functions.html#compile) (т.е. строка или байты). Аргумент *path* должен быть «путём» к месту происхождения исходного кода, что может быть абстрактным понятием (например, местоположение в zip-файле).308309С помощью полученного объекта кода можно выполнить его в модуле, запустив `exec(code, module.__dict__)`.310311Добавлено в версии 3.4.312313Изменено в версии 3.5: метод стал статическим.314315#### `exec_module(module)`316317Реализация [`Loader.exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module).318319Добавлено в версии 3.4.320321#### `load_module(fullname)`322323Реализация [`Loader.load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module).324325Устарело с версии 3.4, будет удалено в версии 3.15: используйте [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader.exec_module).326327#### `class importlib.abc.ExecutionLoader`328329Абстрактный базовый класс, наследующий от [`InspectLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader), который при реализации помогает выполнять модуль как скрипт. Этот ABC представляет необязательный протокол [**PEP 302**](https://python-all.ru/3.13/library/importlib.html).330331#### `abstractmethod get_filename(fullname)`332333> Абстрактный метод, который должен возвращать значение [`__file__`](https://python-all.ru/3.13/reference/datamodel.html#module.__file__) для указанного модуля. Если путь недоступен, возбуждается [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError).334>335> Если исходный код доступен, метод должен возвращать путь к файлу исходного кода, независимо от того, использовался ли байткод для загрузки модуля.336>337> Изменено в версии 3.4: возбуждает [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).338339#### `class importlib.abc.FileLoader(fullname, path)`340341Абстрактный базовый класс, наследующий от [`ResourceLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ResourceLoader) и [`ExecutionLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ExecutionLoader), предоставляющий конкретные реализации [`ResourceLoader.get_data()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ResourceLoader.get_data) и [`ExecutionLoader.get_filename()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ExecutionLoader.get_filename).342343Аргумент *fullname* – это полное разрешённое имя модуля, который должен обрабатывать загрузчик. Аргумент *path* – путь к файлу модуля.344345Добавлено в версии 3.3.346347#### `name`348349Имя модуля, который может обрабатывать загрузчик.350351#### `path`352353Путь к файлу модуля.354355#### `load_module(fullname)`356357Вызывает `load_module()` родительского класса.358359Устарело с версии 3.4, будет удалено в версии 3.15: Вместо этого используйте [`Loader.exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module).360361#### `abstractmethod get_filename(fullname)`362363Возвращает [`path`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.FileLoader.path).364365#### `abstractmethod get_data(path)`366367Читает *path* как двоичный файл и возвращает байты из него.368369#### `class importlib.abc.SourceLoader`370371Абстрактный базовый класс для реализации загрузки файлов с исходным кодом (и, опционально, байткодом). Класс наследует от [`ResourceLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ResourceLoader) и [`ExecutionLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ExecutionLoader), требуя реализации:372373- [`ResourceLoader.get_data()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ResourceLoader.get_data)374- **[`ExecutionLoader.get_filename()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)**375376 Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.377378Абстрактные методы, определённые в этом классе, предназначены для добавления опциональной поддержки файлов байткода. Если не реализовать эти опциональные методы (или заставить их возбуждать [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError)), загрузчик будет работать только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода *и* байткода; это не допускает загрузку *без исходного кода*, когда предоставляется только байткод. Файлы байткода – это оптимизация для ускорения загрузки за счёт удаления этапа разбора компилятором Python, поэтому никакой специальный API для байткода не предоставляется.379380#### `path_stats(path)`381382Опциональный абстрактный метод, возвращающий [`dict`](https://python-all.ru/3.13/library/stdtypes.html#dict), содержащий метаданные о заданном пути. Поддерживаемые ключи словаря:383384- `'mtime'` (обязательный): целое число или число с плавающей точкой, представляющее время изменения исходного кода;385- `'size'` (необязательный): размер исходного кода в байтах.386387Любые другие ключи в словаре игнорируются – это позволяет добавлять расширения в будущем. Если с путём не удаётся работать, возбуждается [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError).388389Добавлено в версии 3.3.390391Изменено в версии 3.4: Теперь возбуждается [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).392393#### `path_mtime(path)`394395Необязательный абстрактный метод, возвращающий время изменения указанного пути.396397Устарело с версии 3.3: Этот метод устарел в пользу [`path_stats()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.SourceLoader.path_stats). Реализовывать его необязательно, но он всё ещё доступен для совместимости. Если путь не удаётся обработать, возбуждается [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError).398399Изменено в версии 3.4: Теперь возбуждается [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).400401#### `set_data(path, data)`402403Необязательный абстрактный метод, записывающий указанные байты в файл по заданному пути. Все недостающие промежуточные каталоги должны быть созданы автоматически.404405Если запись по пути не удаётся из-за того, что путь доступен только для чтения ([`errno.EACCES`](https://python-all.ru/3.13/library/errno.html#errno.EACCES)/[`PermissionError`](https://python-all.ru/3.13/library/exceptions.html#PermissionError)), исключение не должно распространяться.406407Изменено в версии 3.4: Больше не возбуждает [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError) при вызове.408409#### `get_code(fullname)`410411Конкретная реализация [`InspectLoader.get_code()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader.get_code).412413#### `exec_module(module)`414415Конкретная реализация [`Loader.exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module).416417Добавлено в версии 3.4.418419#### `load_module(fullname)`420421Конкретная реализация [`Loader.load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module).422423Устарело с версии 3.4, будет удалено в версии 3.15: Вместо этого используйте [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.SourceLoader.exec_module).424425#### `get_source(fullname)`426427Конкретная реализация [`InspectLoader.get_source()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader.get_source).428429#### `is_package(fullname)`430431Конкретная реализация [`InspectLoader.is_package()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader.is_package). Модуль считается пакетом, если его путь к файлу (получаемый через [`ExecutionLoader.get_filename()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)) представляет собой файл с именем `__init__` после удаления расширения **и** само имя модуля не оканчивается на `__init__`.432433#### `class importlib.abc.ResourceReader`434435*Заменено на TraversableResources*436437An [abstract base class](https://python-all.ru/3.13/glossary.html#term-abstract-base-class) to provide the ability to read *resources*.438439С точки зрения этого ABC, *ресурс* – это бинарный артефакт, поставляемый внутри пакета. Обычно это что-то вроде файла данных, который находится рядом с `__init__.py`-файлом пакета. Назначение этого класса – абстрагировать доступ к таким файлам данных, чтобы не имело значения, хранятся ли пакет и его файлы данных, например, в zip-файле или в файловой системе.440441Для любого из методов этого класса аргумент *resource* должен быть [path-подобным объектом](https://python-all.ru/3.13/glossary.html#term-path-like-object), который по сути представляет собой имя файла. Это означает, что в аргументе *resource* не должно быть путей к подкаталогам. Это связано с тем, что местоположение пакета, для которого предназначен читатель, выступает в роли «каталога». Следовательно, метафора каталогов и имён файлов – это пакеты и ресурсы соответственно. Именно поэтому экземпляры этого класса должны напрямую соответствовать конкретному пакету (а не потенциально представлять несколько пакетов или модуль).442443Загрузчики, желающие поддерживать чтение ресурсов, должны предоставить метод с именем `get_resource_reader(fullname)`, который возвращает объект, реализующий интерфейс этого ABC. Если модуль, указанный fullname, не является пакетом, этот метод должен вернуть [`None`](https://python-all.ru/3.13/library/constants.html#None). Объект, совместимый с этим ABC, должен возвращаться только тогда, когда указанный модуль является пакетом.444445Добавлено в версии 3.7.446447Устарело с версии 3.12, будет удалено в версии 3.14: Вместо этого используйте [`importlib.resources.abc.TraversableResources`](https://python-all.ru/3.13/library/importlib.resources.abc.html#importlib.resources.abc.TraversableResources).448449#### `abstractmethod open_resource(resource)`450451> Возвращает открытый [файлоподобный объект](https://python-all.ru/3.13/glossary.html#term-file-like-object) для бинарного чтения *ресурса*.452>453> Если ресурс не найден, выбрасывается [`FileNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#FileNotFoundError).454455#### `abstractmethod resource_path(resource)`456457> Возвращает путь в файловой системе к *ресурсу*.458>459> Если ресурс не существует на файловой системе в конкретном виде, возбуждается [`FileNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#FileNotFoundError).460461#### `abstractmethod is_resource(name)`462463> Возвращает `True`, если указанный *name* считается ресурсом. [`FileNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#FileNotFoundError) возникает, если *name* не существует.464465#### `abstractmethod contents()`466467> Возвращает [итерируемый объект](https://python-all.ru/3.13/glossary.html#term-iterable) со строками по содержимому пакета. Обратите внимание, что не все имена, возвращаемые итератором, должны быть реальными ресурсами; например, допустимо возвращать имена, для которых [`is_resource()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ResourceReader.is_resource) будет ложным.468>469> Разрешение возвращать имена, не являющиеся ресурсами, предусмотрено для ситуаций, когда заранее известно, как хранятся пакет и его ресурсы, и такие имена могут быть полезны. Например, разрешается возвращать имена подкаталогов, чтобы, когда известно, что пакет и ресурсы хранятся в файловой системе, эти имена подкаталогов можно было использовать напрямую.470>471> Абстрактный метод возвращает итерируемый объект без элементов.472473#### `class importlib.abc.Traversable`474475Объект с подмножеством методов [`pathlib.Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path), подходящих для обхода каталогов и открытия файлов.476477Для представления объекта в файловой системе используйте [`importlib.resources.as_file()`](https://python-all.ru/3.13/library/importlib.resources.html#importlib.resources.as_file).478479Добавлено в версии 3.9.480481Устарело с версии 3.12, будет удалено в версии 3.14: Вместо этого используйте [`importlib.resources.abc.Traversable`](https://python-all.ru/3.13/library/importlib.resources.abc.html#importlib.resources.abc.Traversable).482483#### `name`484485Абстрактный. Базовое имя этого объекта без каких-либо ссылок на родительские элементы.486487#### `abstractmethod iterdir()`488489Порождает объекты `Traversable` в `self`.490491#### `abstractmethod is_dir()`492493Возвращает `True`, если `self` – каталог.494495#### `abstractmethod is_file()`496497Возвращает `True`, если `self` – файл.498499#### `abstractmethod joinpath(child)`500501Возвращает дочерний элемент Traversable в `self`.502503#### `abstractmethod __truediv__(child)`504505Возвращает дочерний элемент `Traversable` в `self`.506507#### `abstractmethod open(mode='r', *args, **kwargs)`508509*mode* может быть 'r' или 'rb' для открытия в текстовом или бинарном режиме. Возвращает дескриптор, подходящий для чтения (то же самое, что [`pathlib.Path.open`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.open)).510511При открытии в текстовом режиме принимает параметры кодировки, аналогичные тем, что принимаются [`io.TextIOWrapper`](https://python-all.ru/3.13/library/io.html#io.TextIOWrapper).512513#### `read_bytes()`514515Читает содержимое `self` в виде байтов.516517#### `read_text(encoding=None)`518519Читает содержимое `self` как текст.520521#### `class importlib.abc.TraversableResources`522523Абстрактный базовый класс для читателей ресурсов, способных обслуживать интерфейс [`importlib.resources.files()`](https://python-all.ru/3.13/library/importlib.resources.html#importlib.resources.files). Подклассы [`importlib.resources.abc.ResourceReader`](https://python-all.ru/3.13/library/importlib.resources.abc.html#importlib.resources.abc.ResourceReader) и предоставляют конкретные реализации абстрактных методов `importlib.resources.abc.ResourceReader`. Поэтому любой загрузчик, предоставляющий `importlib.abc.TraversableResources`, также предоставляет ResourceReader.524525Загрузчики, поддерживающие чтение ресурсов, должны реализовать этот интерфейс.526527Добавлено в версии 3.9.528529Устарело с версии 3.12, будет удалено в версии 3.14: Используйте [`importlib.resources.abc.TraversableResources`](https://python-all.ru/3.13/library/importlib.resources.abc.html#importlib.resources.abc.TraversableResources) вместо этого.530531#### `abstractmethod files()`532533Возвращает объект [`importlib.resources.abc.Traversable`](https://python-all.ru/3.13/library/importlib.resources.abc.html#importlib.resources.abc.Traversable) для загруженного пакета.534535## `importlib.machinery` – Импортёры и перехватчики пути536537**Исходный код:** [Lib/importlib/machinery.py](https://python-all.ru/src/3.13/Lib/importlib/machinery.py)538539---540541Этот модуль содержит различные объекты, помогающие [`import`](https://python-all.ru/3.13/reference/simple_stmts.html#import) находить и загружать модули.542543#### `importlib.machinery.SOURCE_SUFFIXES`544545Список строк, представляющих распознаваемые расширения файлов для исходных модулей.546547Добавлено в версии 3.3.548549#### `importlib.machinery.DEBUG_BYTECODE_SUFFIXES`550551Список строк, представляющих расширения файлов для неоптимизированных байт-код модулей.552553Добавлено в версии 3.3.554555Устарело с версии 3.5: Используйте [`BYTECODE_SUFFIXES`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.BYTECODE_SUFFIXES) вместо.556557#### `importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES`558559Список строк с расширениями файлов для оптимизированных модулей байткода.560561Добавлено в версии 3.3.562563Устарело с версии 3.5: Используйте [`BYTECODE_SUFFIXES`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.BYTECODE_SUFFIXES) вместо.564565#### `importlib.machinery.BYTECODE_SUFFIXES`566567Список строк с распознаваемыми расширениями файлов для модулей байткода (включая начальную точку).568569Добавлено в версии 3.3.570571Изменено в версии 3.5: Значение больше не зависит от `__debug__`.572573#### `importlib.machinery.EXTENSION_SUFFIXES`574575Список строк с распознаваемыми расширениями файлов для модулей расширений.576577Добавлено в версии 3.3.578579#### `importlib.machinery.all_suffixes()`580581Возвращает объединённый список строк со всеми расширениями файлов для модулей, распознаваемых стандартным механизмом импорта. Это вспомогательная функция для кода, которому нужно лишь узнать, может ли путь файловой системы относиться к модулю, без необходимости в деталях о типе модуля (например, [`inspect.getmodulename()`](https://python-all.ru/3.13/library/inspect.html#inspect.getmodulename)).582583Добавлено в версии 3.3.584585#### `class importlib.machinery.BuiltinImporter`586587[Импортёр](https://python-all.ru/3.13/glossary.html#term-importer) для встроенных модулей. Все известные встроенные модули перечислены в [`sys.builtin_module_names`](https://python-all.ru/3.13/library/sys.html#sys.builtin_module_names). Этот класс реализует абстрактные базовые классы [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader).588589В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.590591Изменено в версии 3.5: В рамках [**PEP 489**](https://python-all.ru/3.13/library/importlib.html) встроенный импортёр теперь реализует `Loader.create_module()` и `Loader.exec_module()`.592593#### `class importlib.machinery.FrozenImporter`594595[Импортёр](https://python-all.ru/3.13/glossary.html#term-importer) для замороженных модулей. Этот класс реализует абстрактные базовые классы [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader).596597В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.598599Изменено в версии 3.4: Добавлены методы `create_module()` и `exec_module()`.600601#### `class importlib.machinery.WindowsRegistryFinder`602603[Finder](https://python-all.ru/3.13/glossary.html#term-finder) для модулей, объявленных в реестре Windows. Этот класс реализует абстрактный базовый класс [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder).604605В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.606607Добавлено в версии 3.3.608609Устарело с версии 3.6: Вместо этого используйте конфигурацию [`site`](https://python-all.ru/3.13/library/site.html#module-site). Будущие версии Python могут не включать этот искатель по умолчанию.610611#### `class importlib.machinery.PathFinder`612613[Искатель](https://python-all.ru/3.13/glossary.html#term-finder) для [`sys.path`](https://python-all.ru/3.13/library/sys.html#sys.path) и атрибутов пакета `__path__`. Этот класс реализует абстрактный базовый класс [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder).614615В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.616617#### `classmethod find_spec(fullname, path=None, target=None)`618619Метод класса, который пытается найти [спецификацию](https://python-all.ru/3.13/glossary.html#term-module-spec) для модуля, заданного *fullname* на [`sys.path`](https://python-all.ru/3.13/library/sys.html#sys.path) или, если определён, на *path*. Для каждого просматриваемого элемента пути проверяется [`sys.path_importer_cache`](https://python-all.ru/3.13/library/sys.html#sys.path_importer_cache). Если найден объект, не равный false, то он используется как [искатель элемента пути](https://python-all.ru/3.13/glossary.html#term-path-entry-finder) для поиска искомого модуля. Если элемент не найден в `sys.path_importer_cache`, то [`sys.path_hooks`](https://python-all.ru/3.13/library/sys.html#sys.path_hooks) ищется искатель для элемента пути, и если найден, сохраняется в `sys.path_importer_cache`, а также запрашивается о модуле. Если искатель так и не найден, то `None` сохраняется в кеше и возвращается.620621Добавлено в версии 3.4.622623Изменено в версии 3.5: Если текущая рабочая директория – представленная пустой строкой – больше не является допустимой, то возвращается `None`, но значение не кешируется в [`sys.path_importer_cache`](https://python-all.ru/3.13/library/sys.html#sys.path_importer_cache).624625#### `classmethod invalidate_caches()`626627Вызывает [`importlib.abc.PathEntryFinder.invalidate_caches()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder.invalidate_caches) на всех искателях, хранящихся в [`sys.path_importer_cache`](https://python-all.ru/3.13/library/sys.html#sys.path_importer_cache), которые определяют этот метод. В противном случае записи в `sys.path_importer_cache`, установленные в `None`, удаляются.628629Изменено в версии 3.7: Записи `None` в [`sys.path_importer_cache`](https://python-all.ru/3.13/library/sys.html#sys.path_importer_cache) удаляются.630631Изменено в версии 3.4: Вызывает объекты в [`sys.path_hooks`](https://python-all.ru/3.13/library/sys.html#sys.path_hooks), передавая текущую рабочую директорию в качестве `''` (т.е. пустую строку).632633#### `class importlib.machinery.FileFinder(path, *loader_details)`634635Конкретная реализация [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder), которая кеширует результаты из файловой системы.636637Аргумент *path* – это каталог, за поиск в котором отвечает искатель.638639Аргумент *loader\_details* – это переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознает. Загрузчики должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.640641Искатель будет кешировать содержимое каталога по мере необходимости, вызывая stat для каждого поиска модуля, чтобы убедиться, что кеш не устарел. Поскольку устаревание кеша зависит от гранулярности информации о состоянии файловой системы, предоставляемой операционной системой, существует потенциальное состояние гонки: поиск модуля, создание нового файла и последующий поиск модуля, который представляет этот новый файл. Если операции выполняются достаточно быстро, чтобы уложиться в гранулярность вызовов stat, поиск модуля завершится неудачей. Чтобы этого избежать, при динамическом создании модуля обязательно вызывайте [`importlib.invalidate_caches()`](https://python-all.ru/3.13/library/importlib.html#importlib.invalidate_caches).642643Добавлено в версии 3.3.644645#### `path`646647Путь, в котором будет искать искатель.648649#### `find_spec(fullname, target=None)`650651Пытается найти спецификацию для обработки *fullname* внутри [`path`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.FileFinder.path).652653Добавлено в версии 3.4.654655#### `invalidate_caches()`656657Очищает внутренний кеш.658659#### `classmethod path_hook(*loader_details)`660661Метод класса, возвращающий замыкание для использования в [`sys.path_hooks`](https://python-all.ru/3.13/library/sys.html#sys.path_hooks). Замыкание возвращает экземпляр `FileFinder`, используя аргумент path, переданный непосредственно замыканию, и *loader\_details* косвенно.662663Если аргумент замыкания не является существующим каталогом, вызывается [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError).664665#### `class importlib.machinery.SourceFileLoader(fullname, path)`666667Конкретная реализация [`importlib.abc.SourceLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.SourceLoader) путём наследования от [`importlib.abc.FileLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.FileLoader) и предоставления конкретных реализаций других методов.668669Добавлено в версии 3.3.670671#### `name`672673Имя модуля, который будет обрабатывать этот загрузчик.674675#### `path`676677Путь к исходному файлу.678679#### `is_package(fullname)`680681Возвращает `True`, если [`path`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.SourceFileLoader.path), по-видимому, предназначен для пакета.682683#### `path_stats(path)`684685Конкретная реализация [`importlib.abc.SourceLoader.path_stats()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.SourceLoader.path_stats).686687#### `set_data(path, data)`688689Конкретная реализация [`importlib.abc.SourceLoader.set_data()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.SourceLoader.set_data).690691#### `load_module(name=None)`692693Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.694695Устарело с версии 3.6, будет удалено в версии 3.15: Используйте [`importlib.abc.Loader.exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module) вместо этого.696697#### `class importlib.machinery.SourcelessFileLoader(fullname, path)`698699Конкретная реализация [`importlib.abc.FileLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.FileLoader), которая может импортировать файлы байт-кода (т.е. файлы исходного кода отсутствуют).700701Обратите внимание, что прямое использование файлов байт-кода (а не файлов исходного кода) препятствует тому, чтобы ваши модули могли использоваться всеми реализациями Python или новыми версиями Python, изменяющими формат байт-кода.702703Добавлено в версии 3.3.704705#### `name`706707Имя модуля, который будет обрабатывать загрузчик.708709#### `path`710711Путь к файлу байт-кода.712713#### `is_package(fullname)`714715Определяет, является ли модуль пакетом, на основе [`path`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).716717#### `get_code(fullname)`718719Возвращает объект кода для [`name`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.SourcelessFileLoader.name), созданный из [`path`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).720721#### `get_source(fullname)`722723Возвращает `None`, так как при использовании этого загрузчика файлы байт-кода не имеют исходного кода.724725#### `load_module(name=None)`726727Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.728729Устарело с версии 3.6, будет удалено в версии 3.15: Используйте [`importlib.abc.Loader.exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module) вместо этого.730731#### `class importlib.machinery.ExtensionFileLoader(fullname, path)`732733Конкретная реализация [`importlib.abc.ExecutionLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.ExecutionLoader) для модулей-расширений.734735Аргумент *fullname* задаёт имя модуля, который должен поддерживать загрузчик. Аргумент *path* – это путь к файлу модуля-расширения.736737Обратите внимание: по умолчанию импорт модуля-расширения в подинтерпретаторах завершится ошибкой, если он не реализует многофазную инициализацию (см. [**PEP 489**](https://python-all.ru/3.13/library/importlib.html)), даже если в остальном импорт прошёл бы успешно.738739Добавлено в версии 3.3.740741Изменено в версии 3.12: Многофазная инициализация теперь обязательна для использования в подинтерпретаторах.742743#### `name`744745Имя модуля, который поддерживает загрузчик.746747#### `path`748749Путь к модулю-расширению.750751#### `create_module(spec)`752753Создаёт объект модуля из указанной спецификации в соответствии с [**PEP 489**](https://python-all.ru/3.13/library/importlib.html).754755Добавлено в версии 3.5.756757#### `exec_module(module)`758759Инициализирует указанный объект модуля в соответствии с [**PEP 489**](https://python-all.ru/3.13/library/importlib.html).760761Добавлено в версии 3.5.762763#### `is_package(fullname)`764765Возвращает `True`, если путь к файлу указывает на модуль `__init__` пакета на основе [`EXTENSION_SUFFIXES`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.EXTENSION_SUFFIXES).766767#### `get_code(fullname)`768769Возвращает `None`, так как у модулей-расширений нет объекта кода.770771#### `get_source(fullname)`772773Возвращает `None`, так как у модулей-расширений нет исходного кода.774775#### `get_filename(fullname)`776777Возвращает [`path`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ExtensionFileLoader.path).778779Добавлено в версии 3.4.780781#### `class importlib.machinery.NamespaceLoader(name, path, path_finder)`782783Конкретная реализация [`importlib.abc.InspectLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader) для пространственно-именных пакетов. Это псевдоним закрытого класса и открыт только для интроспекции атрибута `__loader__` в пространственно-именных пакетах:784785```python786>>> from importlib.machinery import NamespaceLoader787>>> import my_namespace788>>> isinstance(my_namespace.__loader__, NamespaceLoader)789True790>>> import importlib.abc791>>> isinstance(my_namespace.__loader__, importlib.abc.Loader)792True793```794795Добавлено в версии 3.12.796797#### `class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)`798799Спецификация состояния модуля, связанного с системой импорта. Обычно она доступна как атрибут [`__spec__`](https://python-all.ru/3.13/reference/datamodel.html#module.__spec__) модуля. Многие из этих атрибутов также доступны напрямую у модуля: например, `module.__spec__.origin == module.__file__`. Однако учтите, что хотя *значения* обычно эквивалентны, они могут отличаться, поскольку синхронизация между двумя объектами отсутствует. Например, можно обновить атрибут модуля [`__file__`](https://python-all.ru/3.13/reference/datamodel.html#module.__file__) во время выполнения, и это не будет автоматически отражено в [`__spec__.origin`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ModuleSpec.origin) модуля, и наоборот.800801Добавлено в версии 3.4.802803#### `name`804805Полное имя модуля (см. [`module.__name__`](https://python-all.ru/3.13/reference/datamodel.html#module.__name__)). [Искатель](https://python-all.ru/3.13/glossary.html#term-finder) всегда должен устанавливать этот атрибут в непустую строку.806807#### `loader`808809[Загрузчик](https://python-all.ru/3.13/glossary.html#term-loader), используемый для загрузки модуля (см. [`module.__loader__`](https://python-all.ru/3.13/reference/datamodel.html#module.__loader__)). [Искатель](https://python-all.ru/3.13/glossary.html#term-finder) всегда должен устанавливать этот атрибут.810811#### `origin`812813Местоположение, которое [загрузчик](https://python-all.ru/3.13/glossary.html#term-loader) должен использовать для загрузки модуля (см. [`module.__file__`](https://python-all.ru/3.13/reference/datamodel.html#module.__file__)). Например, для модулей, загружаемых из файла `.py`, это имя файла. [Искатель](https://python-all.ru/3.13/glossary.html#term-finder) всегда должен устанавливать этот атрибут в осмысленное значение для использования загрузчиком. В редком случае, когда такого местоположения нет (как для пространственно-именных пакетов), его следует установить в `None`.814815#### `submodule_search_locations`816817(возможно пустая) [последовательность](https://python-all.ru/3.13/glossary.html#term-sequence) строк, перечисляющая местоположения, в которых будут найдены подмодули пакета (см. [`module.__path__`](https://python-all.ru/3.13/reference/datamodel.html#module.__path__)). Чаще всего в этом списке будет только один каталог.818819[Искатель](https://python-all.ru/3.13/glossary.html#term-finder) должен устанавливать этот атрибут в последовательность (даже пустую), чтобы указать системе импорта, что модуль является пакетом. Для модулей, не являющихся пакетами, его следует установить в `None`. Позже он автоматически устанавливается в специальный объект для пространственно-именных пакетов.820821#### `loader_state`822823[Искатель](https://python-all.ru/3.13/glossary.html#term-finder) может установить этот атрибут в объект, содержащий дополнительные данные, специфичные для модуля, которые следует использовать при его загрузке. В противном случае его следует установить в `None`.824825#### `cached`826827Имя файла скомпилированной версии кода модуля (см. [`module.__cached__`](https://python-all.ru/3.13/reference/datamodel.html#module.__cached__)). [Искатель](https://python-all.ru/3.13/glossary.html#term-finder) всегда должен устанавливать этот атрибут, но он может быть `None` для модулей, которым не нужно хранить скомпилированный код.828829#### `parent`830831(Только для чтения) Полное имя пакета, в котором находится модуль (или пустая строка для модуля верхнего уровня). См. [`module.__package__`](https://python-all.ru/3.13/reference/datamodel.html#module.__package__). Если модуль является пакетом, то это то же самое, что и [`name`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ModuleSpec.name).832833#### `has_location`834835`True`, если [`origin`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ModuleSpec.origin) спецификации ссылается на загружаемое местоположение, в противном случае `False`. Это значение влияет на то, как интерпретируется `origin` и как заполняется [`__file__`](https://python-all.ru/3.13/reference/datamodel.html#module.__file__) модуля.836837#### `class importlib.machinery.AppleFrameworkLoader(name, path)`838839Специализация [`importlib.machinery.ExtensionFileLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ExtensionFileLoader), которая может загружать модули расширения в формате Framework.840841Для совместимости с iOS App Store *все* двоичные модули в приложении iOS должны быть динамическими библиотеками, содержащимися в framework с соответствующими метаданными, хранящимися в папке `Frameworks` упакованного приложения. На один framework может быть только один двоичный файл, и за пределами папки Frameworks не должно быть исполняемых двоичных материалов.842843Чтобы удовлетворить это требование, при работе на iOS двоичные файлы модулей расширения *не* упаковываются как файлы `.so` на `sys.path`, а как отдельные автономные фреймворки. Для обнаружения этих фреймворков данный загрузчик регистрируется для расширения файла `.fwork`, при этом файл `.fwork` выступает в качестве заполнителя в исходном местоположении двоичного файла на `sys.path`. Файл `.fwork` содержит путь к реальному двоичному файлу в папке `Frameworks` относительно пакета приложения. Чтобы обеспечить возможность обратного разрешения двоичного файла, упакованного в фреймворк, к исходному местоположению, фреймворк должен содержать файл `.origin`, который содержит местоположение файла `.fwork` относительно пакета приложения.844845Например, рассмотрим случай импорта `from foo.bar import _whiz`, где `_whiz` реализован с помощью двоичного модуля `sources/foo/bar/_whiz.abi3.so`, а `sources` – это местоположение, зарегистрированное на `sys.path` относительно пакета приложения. Этот модуль *обязан* распространяться как `Frameworks/foo.bar._whiz.framework/foo.bar._whiz` (имя фреймворка создаётся из полного пути импорта модуля), с файлом `Info.plist` в каталоге `.framework`, идентифицирующим двоичный файл как фреймворк. Модуль `foo.bar._whiz` будет представлен в исходном местоположении файлом-маркером `sources/foo/bar/_whiz.abi3.fwork`, содержащим путь `Frameworks/foo.bar._whiz/foo.bar._whiz`. Фреймворк также будет содержать `Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin` с путём к файлу `.fwork`.846847Когда модуль загружается с помощью этого загрузчика, `__file__` для модуля будет указывать как расположение файла `.fwork`. Это позволяет коду использовать `__file__` модуля как точку привязки для обхода файловой системы. Однако origin спецификации будет ссылаться на расположение *фактического* бинарного файла в папке `.framework`.848849Проект Xcode, собирающий приложение, отвечает за преобразование любых файлов `.so` из их исходного местонахождения в `PYTHONPATH` в фреймворки в папке `Frameworks` (включая удаление расширений из файла модуля, добавление метаданных фреймворка и подпись полученного фреймворка), а также за создание файлов `.fwork` и `.origin`. Обычно это делается с помощью этапа сборки в проекте Xcode; подробнее о том, как организовать этот этап сборки, см. в документации iOS.850851Добавлено в версии 3.13.852853[Доступность](https://python-all.ru/3.13/library/intro.html#availability): iOS.854855#### `name`856857Имя модуля, который поддерживает загрузчик.858859#### `path`860861Путь к файлу `.fwork` для модуля расширения.862863## `importlib.util` – служебный код для импортёров864865**Исходный код:** [Lib/importlib/util.py](https://python-all.ru/src/3.13/Lib/importlib/util.py)866867---868869Этот модуль содержит различные объекты, помогающие в создании [импортёра](https://python-all.ru/3.13/glossary.html#term-importer).870871#### `importlib.util.MAGIC_NUMBER`872873Байты, представляющие номер версии байт-кода. Если требуется помощь в загрузке или записи байт-кода, рекомендуется использовать [`importlib.abc.SourceLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.SourceLoader).874875Добавлено в версии 3.4.876877#### `importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)`878879Возвращает путь [**PEP 3147**](https://python-all.ru/3.13/library/importlib.html)/[**PEP 488**](https://python-all.ru/3.13/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.13/library/exceptions.html#NotImplementedError)).880881Параметр *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.13/library/exceptions.html#ValueError).882883Параметр *debug\_override* устарел и может использоваться для переопределения системного значения `__debug__`. Значение `True` эквивалентно установке *optimization* в пустую строку. Значение `False` аналогично установке *optimization* в `1`. Если оба *debug\_override* и *optimization* не равны `None`, то вызывается [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError).884885Добавлено в версии 3.4.886887Изменено в версии 3.5: Был добавлен параметр *optimization*, а параметр *debug\_override* был объявлен устаревшим.888889Изменено в версии 3.6: Принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object).890891#### `importlib.util.source_from_cache(path)`892893По заданному *path* для имени файла [**PEP 3147**](https://python-all.ru/3.13/library/importlib.html) возвращает связанный путь к файлу исходного кода. Например, если *path* равен `/foo/bar/__pycache__/baz.cpython-32.pyc`, возвращаемый путь будет `/foo/bar/baz.py`. *path* необязательно должен существовать, однако если он не соответствует формату [**PEP 3147**](https://python-all.ru/3.13/library/importlib.html) или [**PEP 488**](https://python-all.ru/3.13/library/importlib.html), вызывается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError). Если `sys.implementation.cache_tag` не определён, вызывается [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).894895Добавлено в версии 3.4.896897Изменено в версии 3.6: Принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object).898899#### `importlib.util.decode_source(source_bytes)`900901Декодирует заданные байты, представляющие исходный код, и возвращает их в виде строки с универсальными символами новой строки (как требуется в [`importlib.abc.InspectLoader.get_source()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.InspectLoader.get_source)).902903Добавлено в версии 3.4.904905#### `importlib.util.resolve_name(name, package)`906907Преобразует относительное имя модуля в абсолютное.908909Если **name** не содержит ведущих точек, то **name** просто возвращается. Это позволяет использовать такие конструкции, как `importlib.util.resolve_name('sys', __spec__.parent)`, без проверки того, требуется ли аргумент **package**.910911[`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) вызывается, если **name** является относительным именем модуля, а **package** – ложное значение (например, `None` или пустая строка). `ImportError` также вызывается, если относительное имя выходит за пределы содержащего его пакета (например, запрос `..bacon` из пакета `spam`).912913Добавлено в версии 3.3.914915Изменено в версии 3.9: Для повышения согласованности с инструкциями import теперь вызывается [`ImportError`](https://python-all.ru/3.13/library/exceptions.html#ImportError) вместо [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError) при недопустимых попытках относительного импорта.916917#### `importlib.util.find_spec(name, package=None)`918919Находит [spec](https://python-all.ru/3.13/glossary.html#term-module-spec) для модуля, возможно, относительно указанного имени **package**. Если модуль находится в [`sys.modules`](https://python-all.ru/3.13/library/sys.html#sys.modules), возвращается `sys.modules[name].__spec__` (если только spec не будет `None` или не задан, и в этом случае вызывается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError)). В противном случае выполняется поиск с помощью [`sys.meta_path`](https://python-all.ru/3.13/library/sys.html#sys.meta_path). `None` возвращается, если spec не найден.920921Если **name** относится к подмодулю (содержит точку), родительский модуль импортируется автоматически.922923**name** и **package** работают так же, как для `import_module()`.924925Добавлено в версии 3.4.926927Изменено в версии 3.7: Вызывает [`ModuleNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#ModuleNotFoundError) вместо [`AttributeError`](https://python-all.ru/3.13/library/exceptions.html#AttributeError), если **package** на самом деле не пакет (т.е. не имеет атрибута [`__path__`](https://python-all.ru/3.13/reference/datamodel.html#module.__path__)).928929#### `importlib.util.module_from_spec(spec)`930931Создаёт новый модуль на основе **spec** и [`spec.loader.create_module`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.create_module).932933Если [`spec.loader.create_module`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.create_module) не возвращает `None`, то любые существующие атрибуты не будут сброшены. Кроме того, [`AttributeError`](https://python-all.ru/3.13/library/exceptions.html#AttributeError) не будет вызвано, если оно сработает при доступе к **spec** или установке атрибута модуля.934935Эта функция предпочтительнее использования [`types.ModuleType`](https://python-all.ru/3.13/library/types.html#types.ModuleType) для создания нового модуля, так как **spec** используется для установки как можно большего количества атрибутов, управляемых импортом, на модуле.936937Добавлено в версии 3.5.938939#### `importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)`940941Фабричная функция для создания экземпляра [`ModuleSpec`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ModuleSpec) на основе загрузчика. Параметры имеют тот же смысл, что и для ModuleSpec. Функция использует доступные [loader](https://python-all.ru/3.13/glossary.html#term-loader) API, такие как `InspectLoader.is_package()`, для заполнения недостающей информации о spec.942943Добавлено в версии 3.4.944945#### `importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)`946947Фабричная функция для создания экземпляра [`ModuleSpec`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ModuleSpec) на основе пути к файлу. Недостающая информация будет заполнена в спецификации с помощью API загрузчика и исходя из того, что модуль будет файловым.948949Добавлено в версии 3.4.950951Изменено в версии 3.6: Принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object).952953#### `importlib.util.source_hash(source_bytes)`954955Возвращает хеш *source\_bytes* в виде байтов. Файл `.pyc` на основе хеша включает `source_hash()` содержимого соответствующего исходного файла в свой заголовок.956957Добавлено в версии 3.7.958959#### `importlib.util._incompatible_extension_module_restrictions(*, disable_check)`960961Менеджер контекста, который позволяет временно пропустить проверку совместимости для модулей-расширений. По умолчанию проверка включена и завершается ошибкой при импорте модуля с однофазной инициализацией в подынтерпретаторе. Она также завершается ошибкой для модуля с многофазной инициализацией, который явно не поддерживает GIL на интерпретатор, при импорте в интерпретатор с собственным GIL.962963Обратите внимание, что эта функция предназначена для необычного случая, который, вероятно, со временем исчезнет. Весьма вероятно, что это не то, что вам нужно.964965Того же эффекта, что и эта функция, можно добиться, реализовав базовый интерфейс многофазной инициализации ([**PEP 489**](https://python-all.ru/3.13/library/importlib.html)) и указав ложную поддержку нескольких интерпретаторов (или GIL на интерпретатор).966967> **Предупреждение**968>969> Использование этой функции для отключения проверки может привести к неожиданному поведению и даже к аварийным завершениям. Её следует применять только при разработке модулей-расширений.970971Добавлено в версии 3.12.972973#### `class importlib.util.LazyLoader(loader)`974975Класс, который откладывает выполнение загрузчика модуля до момента обращения к атрибуту модуля.976977Этот класс **работает только** с загрузчиками, которые определяют [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module), так как требуется контроль над типом модуля, используемого для модуля. По тем же причинам метод [`create_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.create_module) загрузчика должен возвращать `None` или тип, чей атрибут `__class__` можно изменять, а также не использовать [slots](https://python-all.ru/3.13/glossary.html#term-__slots__). Наконец, модули, подменяющие объект, помещённый в [`sys.modules`](https://python-all.ru/3.13/library/sys.html#sys.modules), работать не будут, поскольку невозможно безопасно заменить ссылки на модуль во всём интерпретаторе; если такая подмена обнаружена, возбуждается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError).978979> **Примечание**980>981> Для проектов, где время запуска критично, этот класс позволяет минимизировать затраты на загрузку модуля, если он никогда не используется. Для проектов, где время запуска несущественно, использование этого класса **настоятельно** не рекомендуется, поскольку сообщения об ошибках, возникающие при загрузке, откладываются и появляются вне контекста.982983Добавлено в версии 3.5.984985Изменено в версии 3.6: Начался вызов [`create_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.create_module), удалено предупреждение о совместимости для [`importlib.machinery.BuiltinImporter`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.BuiltinImporter) и [`importlib.machinery.ExtensionFileLoader`](https://python-all.ru/3.13/library/importlib.html#importlib.machinery.ExtensionFileLoader).986987#### `classmethod factory(loader)`988989Метод класса, возвращающий вызываемый объект, который создаёт ленивый загрузчик. Предназначен для использования в ситуациях, когда загрузчик передаётся по классу, а не по экземпляру.990991```python992suffixes = importlib.machinery.SOURCE_SUFFIXES993loader = importlib.machinery.SourceFileLoader994lazy_loader = importlib.util.LazyLoader.factory(loader)995finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))996```997998## Примеры9991000### Программный импорт10011002Для программного импорта модуля используйте [`importlib.import_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.import_module).10031004```python1005import importlib10061007itertools = importlib.import_module('itertools')1008```10091010### Проверка возможности импорта модуля10111012Если нужно узнать, можно ли импортировать модуль, не выполняя сам импорт, следует использовать [`importlib.util.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.find_spec).10131014Обратите внимание: если `name` является подмодулем (содержит точку), [`importlib.util.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.find_spec) импортирует родительский модуль.10151016```python1017import importlib.util1018import sys10191020# Для наглядности.1021name = 'itertools'10221023if name in sys.modules:1024 print(f"{name!r} already in sys.modules")1025elif (spec := importlib.util.find_spec(name)) is not None:1026 # Если требуется выполнить фактический импорт ...1027 module = importlib.util.module_from_spec(spec)1028 sys.modules[name] = module1029 spec.loader.exec_module(module)1030 print(f"{name!r} has been imported")1031else:1032 print(f"can't find the {name!r} module")1033```10341035### Прямой импорт исходного файла10361037Этот рецепт следует использовать с осторожностью: это приближение оператора import, где путь к файлу указан напрямую, а не через поиск [`sys.path`](https://python-all.ru/3.13/library/sys.html#sys.path). Сначала следует рассмотреть альтернативы, такие как изменение `sys.path`, когда требуется полноценный модуль, или использование [`runpy.run_path()`](https://python-all.ru/3.13/library/runpy.html#runpy.run_path), когда подходит глобальное пространство имён, получаемое в результате выполнения Python-файла.10381039Чтобы импортировать исходный файл Python напрямую по пути, используйте следующий рецепт:10401041```python1042import importlib.util1043import sys10441045def import_from_path(module_name, file_path):1046 spec = importlib.util.spec_from_file_location(module_name, file_path)1047 module = importlib.util.module_from_spec(spec)1048 sys.modules[module_name] = module1049 spec.loader.exec_module(module)1050 return module10511052# Только для наглядности (использование `json` произвольно).1053import json1054file_path = json.__file__1055module_name = json.__name__10561057# Результат, аналогичный `import json`.1058json = import_from_path(module_name, file_path)1059```10601061### Реализация ленивого импорта10621063Пример ниже показывает, как реализовать ленивый импорт:10641065```python1066>>> import importlib.util1067>>> import sys1068>>> def lazy_import(name):1069... spec = importlib.util.find_spec(name)1070... loader = importlib.util.LazyLoader(spec.loader)1071... spec.loader = loader1072... module = importlib.util.module_from_spec(spec)1073... sys.modules[name] = module1074... loader.exec_module(module)1075... return module1076...1077>>> lazy_typing = lazy_import("typing")1078>>> #lazy_typing – это реальный объект модуля,1079>>> #но он ещё не загружен в память.1080>>> lazy_typing.TYPE_CHECKING1081False1082```10831084### Настройка импортёра10851086Для глубокой настройки импорта обычно требуется реализовать [импортёр](https://python-all.ru/3.13/glossary.html#term-importer). Это означает управление как [поисковиком](https://python-all.ru/3.13/glossary.html#term-finder), так и [загрузчиком](https://python-all.ru/3.13/glossary.html#term-loader). Для поисковиков есть два варианта в зависимости от потребностей: [поисковик по мета-пути](https://python-all.ru/3.13/glossary.html#term-meta-path-finder) или [поисковик по записям пути](https://python-all.ru/3.13/glossary.html#term-path-entry-finder). Первый помещается в [`sys.meta_path`](https://python-all.ru/3.13/library/sys.html#sys.meta_path), а второй создаётся с помощью [хука записи пути](https://python-all.ru/3.13/glossary.html#term-path-entry-hook) на [`sys.path_hooks`](https://python-all.ru/3.13/library/sys.html#sys.path_hooks), который работает с записями [`sys.path`](https://python-all.ru/3.13/library/sys.html#sys.path) для потенциального создания поисковика. Этот пример покажет, как зарегистрировать собственные импортёры, чтобы импорт их использовал (для создания своего импортёра прочтите документацию по соответствующим классам, определённым в этом пакете):10871088```python1089import importlib.machinery1090import sys10911092# Только для наглядности.1093SpamMetaPathFinder = importlib.machinery.PathFinder1094SpamPathEntryFinder = importlib.machinery.FileFinder1095loader_details = (importlib.machinery.SourceFileLoader,1096 importlib.machinery.SOURCE_SUFFIXES)10971098# Настройка искателя мета-пути.1099# Убедитесь, что искатель помещён в правильное место в списке с точки зрения1100# приоритета.1101sys.meta_path.append(SpamMetaPathFinder)11021103# Настройка искателя точек входа пути.1104# Убедитесь, что хук пути помещён в правильное место в списке с точки зрения1105# приоритета.1106sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))1107```11081109### Аппроксимация [`importlib.import_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.import_module)11101111Сам импорт реализован на Python, что позволяет предоставить доступ к большей части механизма импорта через importlib. Следующий код помогает проиллюстрировать различные API, предоставляемые importlib, путём аппроксимации реализации [`importlib.import_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.import_module):11121113```python1114import importlib.util1115import sys11161117def import_module(name, package=None):1118 """Примерная реализация импорта."""1119 absolute_name = importlib.util.resolve_name(name, package)1120 try:1121 return sys.modules[absolute_name]1122 except KeyError:1123 pass11241125 path = None1126 if '.' in absolute_name:1127 parent_name, _, child_name = absolute_name.rpartition('.')1128 parent_module = import_module(parent_name)1129 path = parent_module.__spec__.submodule_search_locations1130 for finder in sys.meta_path:1131 spec = finder.find_spec(absolute_name, path)1132 if spec is not None:1133 break1134 else:1135 msg = f'No module named {absolute_name!r}'1136 raise ModuleNotFoundError(msg, name=absolute_name)1137 module = importlib.util.module_from_spec(spec)1138 sys.modules[absolute_name] = module1139 spec.loader.exec_module(module)1140 if path is not None:1141 setattr(parent_module, child_name, module)1142 return module1143```1144