Содержание страницы
importlib – реализация import¶importlib – The implementation of import
Новое в версии 3.1.
Исходный код: Lib/importlib/__init__.py
Введение¶Introduction
Назначение пакета importlib двоякое. Во-первых, предоставить реализацию
оператора import (а значит, и функции __import__()) в исходном коде Python. Это даёт
реализацию import, переносимую в любой интерпретатор
Python. Кроме того, такая реализация легче для понимания, чем написанная на другом языке программирования.
Вторая – в этом пакете предоставлены компоненты для реализации import, что упрощает пользователям создание собственных объектов (обобщённо называемых importer) для участия в процессе импорта.
См. также
- Оператор import
Справочник по языку для оператора
import.- Спецификация пакетов
Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе
Noneвsys.modules).- Функция
__import__() Оператор
import– это синтаксический сахар для этой функции.- PEP 235
Импорт на платформах, нечувствительных к регистру
- PEP 263
Определение кодировок исходного кода Python
- PEP 302
Новые хуки импорта
- PEP 328
Импорт: многострочный и абсолютный/относительный
- PEP 366
Явные относительные импорты в главном модуле
- PEP 420
Неявные пакеты пространств имён
- PEP 451
Тип ModuleSpec для системы импорта
- PEP 488
Устранение PYO-файлов
- PEP 489
Многофазная инициализация модулей расширения
- PEP 552
Детерминированные pyc-файлы
- PEP 3120
Использование UTF-8 в качестве кодировки исходного кода по умолчанию
- PEP 3147
Каталоги репозитория PYC
Функции¶Functions
-
importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)¶ Реализация встроенной функции
__import__().Примечание
Для программного импорта модулей следует использовать
import_module()вместо данной функции.
-
importlib.import_module(name, package=None)¶ Импортирует модуль. Аргумент name задаёт импортируемый модуль в абсолютном или относительном выражении (например,
pkg.modили..mod). Если имя задано в относительном выражении, то аргумент package должен быть установлен в имя пакета, который будет служить якорем для разрешения имени пакета (например,import_module('..mod', 'pkg.subpkg')импортируетpkg.mod).Функция
import_module()действует как упрощающая обёртка вокругimportlib.__import__(). Это означает, что вся семантика функции проистекает изimportlib.__import__(). Самое важное различие между этими двумя функциями заключается в том, чтоimport_module()возвращает указанный пакет или модуль (например,pkg.mod), а__import__()возвращает корневой пакет или модуль (например,pkg).При динамическом импорте модуля, созданного после запуска интерпретатора (например, создан Python-файл), может потребоваться вызов
invalidate_caches(), чтобы новый модуль был замечен системой импорта.Изменено в версии 3.3: Родительские пакеты импортируются автоматически.
-
importlib.find_loader(name, path=None)¶ Находит загрузчик для модуля, опционально в пределах указанного path. Если модуль находится в
sys.modules, то возвращаетсяsys.modules[name].__loader__(если только загрузчик не окажетсяNoneили не будет установлен; в этом случае возбуждаетсяValueError). В противном случае выполняется поиск с помощьюsys.meta_path.Noneвозвращается, если загрузчик не найден.Точечное имя не импортирует неявно свои родительские пакеты, так как для этого требуется их загрузка, что может быть нежелательно. Чтобы правильно импортировать подмодуль, необходимо импортировать все родительские пакеты подмодуля и указать правильный аргумент path.
Новое в версии 3.3.
Изменено в версии 3.4: Если
__loader__не установлен, возбуждаетсяValueError, так же как и когда атрибут установлен вNone.Устарело с версии 3.4: Вместо этого используйте
importlib.util.find_spec().
-
importlib.invalidate_caches()¶ Инвалидирует внутренние кеши искателей, хранящиеся в
sys.meta_path. Если искатель реализуетinvalidate_caches(), то он будет вызван для выполнения инвалидации. Эту функцию следует вызывать при создании или установке любых модулей во время работы программы, чтобы гарантировать, что все искатели заметят существование нового модуля.Новое в версии 3.3.
-
importlib.reload(module)¶ Перезагружает ранее импортированный модуль. Аргумент должен быть объектом модуля, то есть он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля во внешнем редакторе и хотите опробовать новую версию, не выходя из интерпретатора Python. Возвращаемое значение – объект модуля (который может отличаться, если повторный импорт помещает другой объект в
sys.modules).Когда выполняется
reload():Код модуля Python перекомпилируется, а код уровня модуля выполняется заново, создавая новый набор объектов, которые привязываются к именам в словаре модуля путём повторного использования загрузчика, который изначально загрузил модуль. Функция
initмодулей расширения не вызывается повторно.Как и все другие объекты в Python, старые объекты освобождаются только после того, как счётчики ссылок на них упадут до нуля.
Имена в пространстве имён модуля обновляются, чтобы указывать на новые или изменённые объекты.
Другие ссылки на старые объекты (например, имена вне модуля) не перепривязываются для указания на новые объекты и должны быть обновлены в каждом пространстве имён, где они встречаются, если это необходимо.
Существует ряд других предостережений:
При перезагрузке модуля его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имён заменяют старые определения, так что это обычно не проблема. Если новая версия модуля не определяет имя, которое было определено старой версией, старое определение сохраняется. Эта возможность может быть использована в пользу модуля, если он поддерживает глобальную таблицу или кеш объектов – с помощью оператора
tryможно проверить наличие таблицы и пропустить её инициализацию, если требуется:try: cache except NameError: cache = {}
Перезагружать встроенные или динамически загружаемые модули обычно не очень полезно. Перезагрузка
sys,__main__,builtinsи других ключевых модулей не рекомендуется. Во многих случаях модули расширения не рассчитаны на инициализацию более одного раза и могут отказывать непредсказуемым образом при перезагрузке.Если модуль импортирует объекты из другого модуля с помощью
from…import…, вызовreload()для другого модуля не переопределяет импортированные из него объекты – один из способов обойти это – повторно выполнить операторfrom, другой – использоватьimportи полные имена (module.name) вместо этого.Если модуль создаёт экземпляры класса, перезагрузка модуля, в котором определён класс, не влияет на определения методов этих экземпляров – они продолжают использовать старое определение класса. То же самое верно и для производных классов.
Новое в версии 3.4.
Изменено в версии 3.7:
ModuleNotFoundErrorвозникает, когда перезагружаемый модуль не имеетModuleSpec.
importlib.abc – абстрактные базовые классы, связанные с импортом¶importlib.abc – Abstract base classes related to import
Исходный код: Lib/importlib/abc.py
Модуль importlib.abc содержит все основные абстрактные базовые классы, используемые import. Также предоставляются некоторые подклассы основных абстрактных базовых классов, помогающие в реализации основных ABC.
Иерархия ABC:
object
+-- Finder (deprecated)
+-- MetaPathFinder
+-- PathEntryFinder
+-- Loader
+-- ResourceLoader --------+
+-- InspectLoader |
+-- ExecutionLoader --+
+-- FileLoader
+-- SourceLoader
-
class
importlib.abc.Finder¶ Абстрактный базовый класс, представляющий искатель.
Устарело с версии 3.3: Используйте
MetaPathFinderилиPathEntryFinderвместо этого.-
abstractmethod
find_module(fullname, path=None)¶ Абстрактный метод для поиска загрузчика для указанного модуля. Изначально описан в PEP 302, этот метод предназначался для использования в
sys.meta_pathи в подсистеме импорта на основе путей.Изменено в версии 3.4: При вызове возвращает
Noneвместо возбужденияNotImplementedError.Устарело с версии 3.10: Вместо этого реализуйте
MetaPathFinder.find_spec()илиPathEntryFinder.find_spec().
-
abstractmethod
-
class
importlib.abc.MetaPathFinder¶ Абстрактный базовый класс, представляющий мета-искатель путей.
Новое в версии 3.3.
Изменено в версии 3.10: Больше не является подклассом
Finder.-
find_spec(fullname, path, target=None)¶ Абстрактный метод для поиска спецификации для указанного модуля. Если это импорт верхнего уровня, path будет
None. В противном случае это поиск подпакета или модуля, и path будет значением__path__из родительского пакета. Если спецификацию не удаётся найти, возвращаетсяNone. При передачеtargetявляется объектом модуля, который искатель может использовать для более обоснованного предположения о том, какую спецификацию вернуть.importlib.util.spec_from_loader()может быть полезен для реализации конкретныхMetaPathFinders.Новое в версии 3.4.
-
find_module(fullname, path)¶ Устаревший метод для поиска загрузчика для указанного модуля. Если это импорт верхнего уровня, path будет равен
None. В противном случае выполняется поиск подпакета или модуля и path будет значением__path__из родительского пакета. Если загрузчик не найден,Noneвозвращается.Если определён
find_spec(), обеспечивается обратно совместимая функциональность.Изменено в версии 3.4: Возвращает
Noneпри вызове вместо возбужденияNotImplementedError. Можно использоватьfind_spec()для обеспечения функциональности.Устарело с версии 3.4: Вместо этого используйте
find_spec().
-
invalidate_caches()¶ Необязательный метод, который при вызове должен инвалидировать любой внутренний кеш, используемый искателем. Используется
importlib.invalidate_caches()при инвалидации кешей всех искателей наsys.meta_path.Изменено в версии 3.4: Возвращает
Noneпри вызове вместоNotImplemented.
-
-
class
importlib.abc.PathEntryFinder¶ Абстрактный базовый класс, представляющий искатель записей путей. Хотя он имеет некоторое сходство с
MetaPathFinder,PathEntryFinderпредназначен для использования только внутри подсистемы импорта на основе путей, предоставляемойimportlib.machinery.PathFinder.Новое в версии 3.3.
Изменено в версии 3.10: Больше не является подклассом
Finder.-
find_spec(fullname, target=None)¶ Абстрактный метод для поиска спецификации для указанного модуля. Искатель будет искать модуль только в пределах той записи пути, к которой он привязан. Если спецификацию не удаётся найти, возвращается
None. При передачеtargetявляется объектом модуля, который искатель может использовать для более обоснованного предположения о том, какую спецификацию вернуть.importlib.util.spec_from_loader()может быть полезен для реализации конкретныхPathEntryFinders.Новое в версии 3.4.
-
find_loader(fullname)¶ Устаревший метод для поиска загрузчика для указанного модуля. Возвращает кортеж из двух элементов
(loader, portion), гдеportion– последовательность местоположений файловой системы, вносящих вклад в часть пакета пространства имён. Загрузчик может бытьNone, аportionуказывает на вклад местоположений файловой системы в пакет пространства имён. Пустой список можно использовать дляportion, чтобы указать, что загрузчик не является частью пакета пространства имён. ЕслиloaderравенNoneиportion– пустой список, то загрузчик или местоположение для пакета пространства имён не найдены (т.е. не удалось ничего найти для модуля).Если определён
find_spec(), обеспечивается обратно совместимая функциональность.Изменено в версии 3.4: Возвращает
(None, [])вместо возбужденияNotImplementedError. Используетfind_spec()при наличии для обеспечения функциональности.Устарело с версии 3.4: Вместо этого используйте
find_spec().
-
find_module(fullname)¶ Конкретная реализация
Finder.find_module(), эквивалентнаяself.find_loader(fullname)[0].Устарело с версии 3.4: Вместо этого используйте
find_spec().
-
invalidate_caches()¶ Необязательный метод, который при вызове должен инвалидировать любой внутренний кеш, используемый искателем. Используется
importlib.machinery.PathFinder.invalidate_caches()при инвалидации кешей всех кешированных искателей.
-
-
class
importlib.abc.Loader¶ Абстрактный базовый класс для загрузчика. См. PEP 302 для точного определения загрузчика.
Загрузчики, желающие поддерживать чтение ресурсов, должны реализовать метод
get_resource_reader(fullname), как указано вimportlib.abc.ResourceReader.Изменено в версии 3.7: Введён необязательный метод
get_resource_reader().-
create_module(spec)¶ Метод, который возвращает объект модуля для использования при импорте модуля. Этот метод может вернуть
None, что означает, что должна применяться семантика создания модуля по умолчанию.Новое в версии 3.4.
Изменено в версии 3.5: Начиная с Python 3.6, этот метод перестанет быть необязательным, если определён
exec_module().
-
exec_module(module)¶ Абстрактный метод, который выполняет модуль в его собственном пространстве имён при импорте или перезагрузке модуля. Модуль уже должен быть проинициализирован к моменту вызова
exec_module(). Если этот метод определён,create_module()также должен быть определён.Новое в версии 3.4.
Изменено в версии 3.6:
create_module()также должен быть определён.
-
load_module(fullname)¶ Устаревший метод загрузки модуля. Если модуль не может быть загружен, вызывается
ImportError, иначе возвращается загруженный модуль.Если запрошенный модуль уже существует в
sys.modules, то следует использовать и перезагрузить именно его. В противном случае загрузчик должен создать новый модуль и вставить его вsys.modulesдо начала загрузки, чтобы избежать рекурсии при импорте. Если загрузчик вставил модуль, но загрузка завершилась неудачей, он должен удалить его изsys.modules; модули, уже находившиеся вsys.modulesдо начала работы загрузчика, следует оставить нетронутыми (см.importlib.util.module_for_loader()).Загрузчик должен установить несколько атрибутов модуля. (Обратите внимание, что некоторые из этих атрибутов могут измениться при перезагрузке модуля):
__name__Имя модуля.
__file__Путь к месту хранения данных модуля (не задан для встроенных модулей).
__cached__Путь к месту, где хранится или должна храниться скомпилированная версия модуля (не задан, если атрибут неуместен).
__path__Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.
__package__Полное имя пакета, в котором модуль был загружен как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов это то же самое, что
__name__. Декораторimportlib.util.module_for_loader()может самостоятельно обработать детали для__package__.
__loader__Загрузчик, используемый для загрузки модуля. Декоратор
importlib.util.module_for_loader()может самостоятельно обработать детали для__package__.
Если
exec_module()доступен, то предоставляется обратно совместимая функциональность.Изменено в версии 3.4: Возбуждает
ImportErrorпри вызове вместоNotImplementedError. Функциональность доступна, еслиexec_module()присутствует.Устарело с версии 3.4: Рекомендуемый API для загрузки модуля –
exec_module()(иcreate_module()). Загрузчики должны реализовывать его вместо load_module(). Механизм импорта берёт на себя все остальные обязанности load_module(), когда реализован exec_module().
-
module_repr(module)¶ Устаревший метод, который при реализации вычисляет и возвращает строковое представление заданного модуля в виде строки. Стандартный repr() для типа модуля будет использовать результат этого метода по необходимости.
Новое в версии 3.3.
Изменено в версии 3.4: Сделано необязательным вместо абстрактного метода.
Устарело с версии 3.4: Механизм импорта теперь заботится об этом автоматически.
-
-
class
importlib.abc.ResourceReader¶ Заменено на TraversableResources
An abstract base class to provide the ability to read resources.
С точки зрения этого ABC, ресурс – это бинарный артефакт, поставляемый внутри пакета. Обычно это что-то вроде файла данных, который находится рядом с
__init__.pyфайлом пакета. Назначение этого класса – абстрагировать доступ к таким файлам данных, чтобы не имело значения, хранятся ли пакет и его файлы данных, например, в zip-архиве или в файловой системе.Для любого из методов этого класса аргумент resource должен быть path-подобным объектом, который по сути представляет собой имя файла. Это означает, что в аргументе resource не должно быть путей к подкаталогам. Это связано с тем, что местоположение пакета, для которого предназначен читатель, выступает в роли «каталога». Следовательно, метафора каталогов и имён файлов – это пакеты и ресурсы соответственно. Именно поэтому экземпляры этого класса должны напрямую соответствовать конкретному пакету (а не потенциально представлять несколько пакетов или модуль).
Загрузчики, желающие поддерживать чтение ресурсов, должны предоставить метод с именем
get_resource_reader(fullname), который возвращает объект, реализующий интерфейс этого ABC. Если модуль, указанный fullname, не является пакетом, этот метод должен вернутьNone. Объект, совместимый с этим ABC, должен возвращаться только тогда, когда указанный модуль является пакетом.Добавлено в версии 3.7.
-
abstractmethod
open_resource(resource)¶ Возвращает открытый файлоподобный объект для бинарного чтения ресурса.
Если ресурс не найден, выбрасывается
FileNotFoundError.
-
abstractmethod
resource_path(resource)¶ Возвращает путь в файловой системе к ресурсу.
Если ресурс не существует на файловой системе в конкретном виде, возбуждается
FileNotFoundError.
-
abstractmethod
is_resource(name)¶ Возвращает
True, если указанный name считается ресурсом.FileNotFoundErrorвозникает, если name не существует.
-
abstractmethod
contents()¶ Возвращает итерируемый объект со строками по содержимому пакета. Обратите внимание, что не все имена, возвращаемые итератором, должны быть реальными ресурсами; например, допустимо возвращать имена, для которых
is_resource()будет ложным.Разрешение возвращать имена, не являющиеся ресурсами, предусмотрено для ситуаций, когда заранее известно, как хранятся пакет и его ресурсы, и такие имена могут быть полезны. Например, разрешается возвращать имена подкаталогов, чтобы, когда известно, что пакет и ресурсы хранятся в файловой системе, эти имена подкаталогов можно было использовать напрямую.
Абстрактный метод возвращает итерируемый объект без элементов.
-
abstractmethod
-
class
importlib.abc.ResourceLoader¶ Абстрактный базовый класс для загрузчика, который реализует опциональный протокол PEP 302 для загрузки произвольных ресурсов из бэкенда хранилища.
Устарело с версии 3.7: Этот ABC устарел в пользу поддержки загрузки ресурсов через
importlib.abc.ResourceReader.-
abstractmethod
get_data(path)¶ Абстрактный метод, возвращающий байты для данных, расположенных по пути path. Загрузчики, использующие файлоподобное хранилище, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод, чтобы обеспечить прямой доступ к хранимым данным. Если path не найден, возбуждается
OSError. Ожидается, что path будет сформирован с использованием атрибута__file__модуля или элемента из__path__пакета.Изменено в версии 3.4: возбуждает
OSErrorвместоNotImplementedError.
-
abstractmethod
-
class
importlib.abc.InspectLoader¶ Абстрактный базовый класс для загрузчика, который реализует опциональный протокол PEP 302 для загрузчиков, которые инспектируют модули.
-
get_code(fullname)¶ Возвращает объект кода для модуля или
None, если модуль не имеет объекта кода (как, например, для встроенного модуля). ВозбуждаетImportError, если загрузчик не может найти запрошенный модуль.Примечание
Хотя метод имеет реализацию по умолчанию, рекомендуется переопределить его, если это возможно для повышения производительности.
Изменено в версии 3.4: Больше не является абстрактным, предоставлена конкретная реализация.
-
abstractmethod
get_source(fullname)¶ Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием универсальных символов новой строки, преобразуя все распознанные разделители строк в символы
'\n'. ВозвращаетNone, если исходный код недоступен (например, для встроенного модуля). ВозбуждаетImportError, если загрузчик не может найти указанный модуль.Изменено в версии 3.4: возбуждает
ImportErrorвместоNotImplementedError.
-
is_package(fullname)¶ Необязательный метод, возвращающий истинное значение, если модуль является пакетом, и ложное в противном случае.
ImportErrorвозбуждается, если загрузчик не может найти модуль.Изменено в версии 3.4: возбуждает
ImportErrorвместоNotImplementedError.
-
static
source_to_code(data, path='<string>')¶ Создаёт объект кода из исходного кода Python.
Аргумент data может быть любым значением, которое поддерживает функция
compile()(т.е. строка или байты). Аргумент path должен быть «путём» к месту происхождения исходного кода, что может быть абстрактным понятием (например, местоположение в zip-файле).С помощью полученного объекта кода можно выполнить его в модуле, запустив
exec(code, module.__dict__).Новое в версии 3.4.
Изменено в версии 3.5: метод стал статическим.
-
exec_module(module)¶ Реализация
Loader.exec_module().Новое в версии 3.4.
-
load_module(fullname)¶ Реализация
Loader.load_module().Устарело с версии 3.4: используйте
exec_module().
-
-
class
importlib.abc.ExecutionLoader¶ Абстрактный базовый класс, наследующий от
InspectLoader, который при реализации помогает выполнять модуль как скрипт. Этот ABC представляет необязательный протокол PEP 302.-
abstractmethod
get_filename(fullname)¶ Абстрактный метод, который должен возвращать значение
__file__для указанного модуля. Если путь недоступен, возбуждаетсяImportError.Если исходный код доступен, метод должен возвращать путь к файлу исходного кода, независимо от того, использовался ли байткод для загрузки модуля.
Изменено в версии 3.4: возбуждает
ImportErrorвместоNotImplementedError.
-
abstractmethod
-
class
importlib.abc.FileLoader(fullname, path)¶ Абстрактный базовый класс, наследующий от
ResourceLoaderиExecutionLoader, предоставляющий конкретные реализацииResourceLoader.get_data()иExecutionLoader.get_filename().Аргумент fullname – это полное разрешённое имя модуля, который должен обрабатывать загрузчик. Аргумент path – путь к файлу модуля.
Новое в версии 3.3.
-
name¶ Имя модуля, который может обрабатывать загрузчик.
-
path¶ Путь к файлу модуля.
-
load_module(fullname)¶ Вызывает
load_module()родительского класса.Устарело с версии 3.4: Вместо этого используйте
Loader.exec_module().
-
abstractmethod
get_data(path)¶ Читает path как двоичный файл и возвращает байты из него.
-
-
class
importlib.abc.SourceLoader¶ Абстрактный базовый класс для реализации загрузки файлов с исходным кодом (и, опционально, байткодом). Класс наследует от
ResourceLoaderиExecutionLoader, требуя реализации:ExecutionLoader.get_filename()Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.
Абстрактные методы, определённые в этом классе, предназначены для добавления опциональной поддержки файлов байткода. Если не реализовать эти опциональные методы (или заставить их возбуждать
NotImplementedError), загрузчик будет работать только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода и байткода; это не допускает загрузку без исходного кода, когда предоставляется только байткод. Файлы байткода – это оптимизация для ускорения загрузки за счёт удаления этапа разбора компилятором Python, поэтому никакой специальный API для байткода не предоставляется.-
path_stats(path)¶ Опциональный абстрактный метод, возвращающий
dict, содержащий метаданные о заданном пути. Поддерживаемые ключи словаря:'mtime'(обязательный): целое число или число с плавающей точкой, представляющее время изменения исходного кода;'size'(необязательный): размер исходного кода в байтах.
Любые другие ключи в словаре игнорируются – это позволяет добавлять расширения в будущем. Если с путём не удаётся работать, возбуждается
OSError.Новое в версии 3.3.
Изменено в версии 3.4: Теперь возбуждается
OSErrorвместоNotImplementedError.
-
path_mtime(path)¶ Необязательный абстрактный метод, возвращающий время изменения указанного пути.
Устарело с версии 3.3: Этот метод устарел в пользу
path_stats(). Реализовывать его необязательно, но он всё ещё доступен для совместимости. Если путь не удаётся обработать, возбуждаетсяOSError.Изменено в версии 3.4: Теперь возбуждается
OSErrorвместоNotImplementedError.
-
set_data(path, data)¶ Необязательный абстрактный метод, записывающий указанные байты в файл по заданному пути. Все недостающие промежуточные каталоги должны быть созданы автоматически.
Если запись по пути не удаётся из-за того, что путь доступен только для чтения (
errno.EACCES/PermissionError), исключение не должно распространяться.Изменено в версии 3.4: Больше не возбуждает
NotImplementedErrorпри вызове.
-
get_code(fullname)¶ Конкретная реализация
InspectLoader.get_code().
-
exec_module(module)¶ Конкретная реализация
Loader.exec_module().Новое в версии 3.4.
-
load_module(fullname)¶ Конкретная реализация
Loader.load_module().Устарело с версии 3.4: Вместо этого используйте
exec_module().
-
get_source(fullname)¶ Конкретная реализация
InspectLoader.get_source().
-
is_package(fullname)¶ Конкретная реализация
InspectLoader.is_package(). Модуль считается пакетом, если его путь к файлу (получаемый черезExecutionLoader.get_filename()) представляет собой файл с именем__init__после удаления расширения и само имя модуля не оканчивается на__init__.
-
class
importlib.abc.Traversable¶ Объект с подмножеством методов
pathlib.Path, подходящих для обхода каталогов и открытия файлов.Для представления объекта в файловой системе используйте
importlib.resources.as_file().Новое в версии 3.9.
-
abstractmethod
name()¶ Базовое имя этого объекта без каких-либо ссылок на родителя.
-
abstractmethod
iterdir()¶ Возвращает объекты Traversable внутри self.
-
abstractmethod
is_dir()¶ Возвращает True, если self является каталогом.
-
abstractmethod
is_file()¶ Возвращает True, если self является файлом.
-
abstractmethod
joinpath(child)¶ Возвращает дочерний элемент Traversable в self.
-
abstractmethod
__truediv__(child)¶ Возвращает дочерний элемент Traversable в self.
-
abstractmethod
open(mode='r', *args, **kwargs)¶ mode может быть 'r' или 'rb' для открытия в текстовом или бинарном режиме. Возвращает дескриптор, подходящий для чтения (то же самое, что
pathlib.Path.open).При открытии в текстовом режиме принимает параметры кодировки, аналогичные тем, что принимаются
io.TextIOWrapper.
-
read_bytes()¶ Читает содержимое self как байты.
-
read_text(encoding=None)¶ Читает содержимое self как текст.
Примечание: начиная с Python 3.11 этот класс находится в
importlib.resources.abc.-
abstractmethod
-
class
importlib.abc.TraversableResources¶ Абстрактный базовый класс для читателей ресурсов, способных обслуживать интерфейс
files. Подклассы ResourceReader предоставляют конкретные реализации абстрактных методов ResourceReader. Поэтому любой загрузчик, предоставляющий TraversableResources, также предоставляет ResourceReader.Загрузчики, поддерживающие чтение ресурсов, должны реализовать этот интерфейс.
Новое в версии 3.9.
Примечание: начиная с Python 3.11 этот класс находится в
importlib.resources.abc.
importlib.resources – Resources¶
Исходный код: Lib/importlib/resources.py
Добавлено в версии 3.7.
Этот модуль использует систему импорта Python для предоставления доступа к ресурсам внутри пакетов. Если пакет можно импортировать, то можно получить доступ к ресурсам внутри этого пакета. Ресурсы можно открывать или читать в двоичном или текстовом режиме.
Ресурсы примерно аналогичны файлам внутри каталогов, хотя важно помнить, что это всего лишь метафора. Ресурсы и пакеты не обязаны существовать как физические файлы и каталоги в файловой системе.
Примечание
Этот модуль предоставляет функциональность, аналогичную pkg_resources Базовый доступ к ресурсам без накладных расходов на производительность, присущих тому пакету. Это упрощает чтение ресурсов, входящих в состав пакетов, обеспечивая более стабильную и последовательную семантику.
Автономный бэкпорт этого модуля предоставляет дополнительную информацию об использовании importlib.resources и миграции с pkg_resources на importlib.resources.
Загрузчики, желающие поддерживать чтение ресурсов, должны реализовать метод get_resource_reader(fullname), как указано в importlib.abc.ResourceReader.
Определены следующие типы.
-
importlib.resources.Package¶ Тип
Packageопределён какUnion[str, ModuleType]. Это означает, что там, где функция указывает, что принимаетPackage, можно передавать либо строку, либо модуль. Объекты модулей должны иметь разрешимый__spec__.submodule_search_locations, который не являетсяNone.
-
importlib.resources.Resource¶ Этот тип описывает имена ресурсов, передаваемые в различные функции этого пакета. Он определён как
Union[str, os.PathLike].
Доступны следующие функции.
-
importlib.resources.files(package)¶ Возвращает объект
importlib.abc.Traversable, представляющий контейнер ресурсов для пакета (аналог каталога) и его ресурсы (аналог файлов). Traversable может содержать другие контейнеры (аналог подкаталогов).package – это либо имя, либо объект модуля, соответствующий требованиям
Package.Новое в версии 3.9.
-
importlib.resources.as_file(traversable)¶ Принимает объект
importlib.abc.Traversable, представляющий файл (обычно изimportlib.resources.files()), и возвращает менеджер контекста для использования в оператореwith. Менеджер контекста предоставляет объектpathlib.Path.Выход из менеджера контекста удаляет все временные файлы, созданные при извлечении ресурса, например, из zip-файла.
Используйте
as_file, когда методов Traversable (read_textи т. д.) недостаточно и требуется реальный файл в файловой системе.Новое в версии 3.9.
-
importlib.resources.open_binary(package, resource)¶ Открывает ресурс внутри пакета для двоичного чтения.
package – это либо имя, либо объект модуля, соответствующий требованиям
Package. resource – имя ресурса для открытия внутри package; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает экземплярtyping.BinaryIO– двоичный поток I/O, открытый для чтения.
-
importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict')¶ Открывает ресурс внутри пакета для текстового чтения. По умолчанию ресурс открывается для чтения в кодировке UTF-8.
package – это либо имя, либо объект модуля, соответствующий требованиям
Package. resource – имя ресурса для открытия внутри package; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и во встроеннойopen().Эта функция возвращает экземпляр
typing.TextIO– текстовый поток I/O, открытый для чтения.
-
importlib.resources.read_binary(package, resource)¶ Читает и возвращает содержимое ресурса внутри пакета в виде
bytes.package – это либо имя, либо объект модуля, соответствующий требованиям
Package. resource – имя ресурса для открытия внутри package; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает содержимое ресурса в видеbytes.
-
importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict')¶ Читает и возвращает содержимое ресурса внутри пакета в виде
str. По умолчанию содержимое читается как строгий UTF-8.package – это либо имя, либо объект модуля, соответствующий требованиям
Package. resource – имя ресурса для открытия внутри package; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и во встроеннойopen(). Эта функция возвращает содержимое ресурса в видеstr.
-
importlib.resources.path(package, resource)¶ Возвращает путь к ресурсу в виде реального пути файловой системы. Эта функция возвращает менеджер контекста для использования в операторе
with. Менеджер контекста предоставляет объектpathlib.Path.При выходе из менеджера контекста удаляются все временные файлы, созданные при извлечении ресурса, например, из zip-файла.
package – это либо имя, либо объект модуля, соответствующий требованиям
Package. resource – имя ресурса для открытия внутри package; он не должен содержать разделителей пути и не может иметь подресурсов (т.е. не может быть каталогом).
-
importlib.resources.is_resource(package, name)¶ Возвращает
True, если в пакете есть ресурс с именем name, иначеFalse. Помните, что каталоги не являются ресурсами! package – это либо имя, либо объект модуля, который соответствует требованиямPackage.
importlib.machinery – Импортёры и перехватчики пути¶importlib.machinery – Importers and path hooks
Исходный код: Lib/importlib/machinery.py
Этот модуль содержит различные объекты, помогающие import
находить и загружать модули.
-
importlib.machinery.SOURCE_SUFFIXES¶ Список строк, представляющих распознаваемые расширения файлов для исходных модулей.
Новое в версии 3.3.
-
importlib.machinery.DEBUG_BYTECODE_SUFFIXES¶ Список строк, представляющих расширения файлов для неоптимизированных байт-код модулей.
Новое в версии 3.3.
Устарело с версии 3.5: Используйте
BYTECODE_SUFFIXESвместо.
-
importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES¶ Список строк с расширениями файлов для оптимизированных модулей байткода.
Новое в версии 3.3.
Устарело с версии 3.5: Используйте
BYTECODE_SUFFIXESвместо.
-
importlib.machinery.BYTECODE_SUFFIXES¶ Список строк с распознаваемыми расширениями файлов для модулей байткода (включая начальную точку).
Новое в версии 3.3.
Изменено в версии 3.5: Значение больше не зависит от
__debug__.
-
importlib.machinery.EXTENSION_SUFFIXES¶ Список строк с распознаваемыми расширениями файлов для модулей расширений.
Новое в версии 3.3.
-
importlib.machinery.all_suffixes()¶ Возвращает объединённый список строк со всеми расширениями файлов для модулей, распознаваемых стандартным механизмом импорта. Это вспомогательная функция для кода, которому нужно лишь узнать, может ли путь файловой системы относиться к модулю, без необходимости в деталях о типе модуля (например,
inspect.getmodulename()).Новое в версии 3.3.
-
class
importlib.machinery.BuiltinImporter¶ Импортёр для встроенных модулей. Все известные встроенные модули перечислены в
sys.builtin_module_names. Этот класс реализует абстрактные базовые классыimportlib.abc.MetaPathFinderиimportlib.abc.InspectLoader.В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.
Изменено в версии 3.5: В рамках PEP 489 встроенный импортёр теперь реализует
Loader.create_module()иLoader.exec_module().
-
class
importlib.machinery.FrozenImporter¶ Импортёр для замороженных модулей. Этот класс реализует абстрактные базовые классы
importlib.abc.MetaPathFinderиimportlib.abc.InspectLoader.В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.
Изменено в версии 3.4: Добавлены методы
create_module()иexec_module().
-
class
importlib.machinery.WindowsRegistryFinder¶ Finder для модулей, объявленных в реестре Windows. Этот класс реализует абстрактный базовый класс
importlib.abc.MetaPathFinder.В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.
Новое в версии 3.3.
Устарело с версии 3.6: Вместо этого используйте конфигурацию
site. Будущие версии Python могут не включать этот искатель по умолчанию.
-
class
importlib.machinery.PathFinder¶ Искатель для
sys.pathи атрибутов пакета__path__. Этот класс реализует абстрактный базовый классimportlib.abc.MetaPathFinder.В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.
-
classmethod
find_spec(fullname, path=None, target=None)¶ Метод класса, который пытается найти спецификацию для модуля, заданного fullname на
sys.pathили, если определён, на path. Для каждого просматриваемого элемента пути проверяетсяsys.path_importer_cache. Если найден объект, не равный false, то он используется как искатель элемента пути для поиска искомого модуля. Если элемент не найден вsys.path_importer_cache, тоsys.path_hooksищется искатель для элемента пути, и если найден, сохраняется вsys.path_importer_cache, а также запрашивается о модуле. Если искатель так и не найден, тоNoneсохраняется в кеше и возвращается.Новое в версии 3.4.
Изменено в версии 3.5: Если текущая рабочая директория – представленная пустой строкой – больше не является допустимой, то возвращается
None, но значение не кешируется вsys.path_importer_cache.
-
classmethod
find_module(fullname, path=None)¶ Устаревшая обёртка для
find_spec().Устарело с версии 3.4: Вместо этого используйте
find_spec().
-
classmethod
invalidate_caches()¶ Вызывает
importlib.abc.PathEntryFinder.invalidate_caches()на всех искателях, хранящихся вsys.path_importer_cache, которые определяют этот метод. В противном случае записи вsys.path_importer_cache, установленные вNone, удаляются.Изменено в версии 3.7: Записи
Noneвsys.path_importer_cacheудаляются.
Изменено в версии 3.4: Вызывает объекты в
sys.path_hooks, передавая текущую рабочую директорию в качестве''(т.е. пустую строку).-
classmethod
-
class
importlib.machinery.FileFinder(path, *loader_details)¶ Конкретная реализация
importlib.abc.PathEntryFinder, которая кеширует результаты из файловой системы.Аргумент path – это каталог, за поиск в котором отвечает искатель.
Аргумент loader_details – это переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознает. Загрузчики должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.
Искатель будет кешировать содержимое каталога по мере необходимости, вызывая stat для каждого поиска модуля, чтобы убедиться, что кеш не устарел. Поскольку устаревание кеша зависит от гранулярности информации о состоянии файловой системы, предоставляемой операционной системой, существует потенциальное состояние гонки: поиск модуля, создание нового файла и последующий поиск модуля, который представляет этот новый файл. Если операции выполняются достаточно быстро, чтобы уложиться в гранулярность вызовов stat, поиск модуля завершится неудачей. Чтобы этого избежать, при динамическом создании модуля обязательно вызывайте
importlib.invalidate_caches().Новое в версии 3.3.
-
path¶ Путь, в котором будет искать искатель.
-
find_spec(fullname, target=None)¶ Пытается найти спецификацию для обработки fullname внутри
path.Новое в версии 3.4.
-
find_loader(fullname)¶ Пытается найти загрузчик для fullname в
path.Устарело с версии 3.10: используйте
find_spec()вместо этого.
-
invalidate_caches()¶ Очищает внутренний кеш.
-
classmethod
path_hook(*loader_details)¶ Метод класса, возвращающий замыкание для использования в
sys.path_hooks. Замыкание возвращает экземплярFileFinder, используя аргумент path, переданный непосредственно замыканию, и loader_details косвенно.Если аргумент замыкания не является существующим каталогом, вызывается
ImportError.
-
-
class
importlib.machinery.SourceFileLoader(fullname, path)¶ Конкретная реализация
importlib.abc.SourceLoaderпутём наследования отimportlib.abc.FileLoaderи предоставления конкретных реализаций других методов.Новое в версии 3.3.
-
name¶ Имя модуля, который будет обрабатывать этот загрузчик.
-
path¶ Путь к исходному файлу.
-
path_stats(path)¶ Конкретная реализация
importlib.abc.SourceLoader.path_stats().
-
set_data(path, data)¶ Конкретная реализация
importlib.abc.SourceLoader.set_data().
-
load_module(name=None)¶ Конкретная реализация
importlib.abc.Loader.load_module(), где указание имени загружаемого модуля необязательно.Устарело с версии 3.6: Используйте
importlib.abc.Loader.exec_module()вместо.
-
-
class
importlib.machinery.SourcelessFileLoader(fullname, path)¶ Конкретная реализация
importlib.abc.FileLoader, которая может импортировать файлы байт-кода (т.е. файлы исходного кода отсутствуют).Обратите внимание, что прямое использование файлов байт-кода (а не файлов исходного кода) препятствует тому, чтобы ваши модули могли использоваться всеми реализациями Python или новыми версиями Python, изменяющими формат байт-кода.
Новое в версии 3.3.
-
name¶ Имя модуля, который будет обрабатывать загрузчик.
-
path¶ Путь к файлу байт-кода.
-
get_source(fullname)¶ Возвращает
None, так как при использовании этого загрузчика файлы байт-кода не имеют исходного кода.
-
load_module(name=None)¶
Конкретная реализация
importlib.abc.Loader.load_module(), где указание имени загружаемого модуля необязательно.Устарело с версии 3.6: Используйте
importlib.abc.Loader.exec_module()вместо.-
-
class
importlib.machinery.ExtensionFileLoader(fullname, path)¶ Конкретная реализация
importlib.abc.ExecutionLoaderдля модулей-расширений.Аргумент fullname задаёт имя модуля, который должен поддерживать загрузчик. Аргумент path – это путь к файлу модуля-расширения.
Новое в версии 3.3.
-
name¶ Имя модуля, который поддерживает загрузчик.
-
path¶ Путь к модулю-расширению.
-
create_module(spec)¶ Создаёт объект модуля из указанной спецификации в соответствии с PEP 489.
Новое в версии 3.5.
-
exec_module(module)¶ Инициализирует указанный объект модуля в соответствии с PEP 489.
Новое в версии 3.5.
-
is_package(fullname)¶ Возвращает
True, если путь к файлу указывает на модуль__init__пакета на основеEXTENSION_SUFFIXES.
-
get_code(fullname)¶ Возвращает
None, так как у модулей-расширений нет объекта кода.
-
get_source(fullname)¶ Возвращает
None, так как у модулей-расширений нет исходного кода.
-
-
class
importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)¶ Спецификация состояния модуля, связанного с системой импорта. Обычно она доступна как атрибут
__spec__модуля. В описаниях ниже имена в скобках указывают соответствующий атрибут, доступный непосредственно у объекта модуля. Например,module.__spec__.origin == module.__file__. Однако обратите внимание, что хотя значения обычно эквивалентны, они могут различаться, поскольку между двумя объектами нет синхронизации. Таким образом, можно обновить__path__модуля во время выполнения, и это не будет автоматически отражено в__spec__.submodule_search_locations.Новое в версии 3.4.
-
name¶
(
__name__)Строка с полным квалифицированным именем модуля.
-
loader¶
(
__loader__)Loader, который следует использовать при загрузке модуля. Finders должны всегда устанавливать его.
-
origin¶
(
__file__)Имя места, из которого загружается модуль, например «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно «origin» должен быть установлен, но он может быть
None(значение по умолчанию), что означает, что он не указан (например, для пространств имён пакетов).-
submodule_search_locations¶
(
__path__)Список строк, указывающих, где искать подмодули, если это пакет (иначе
None).-
loader_state¶
Контейнер дополнительных данных модуля для использования во время загрузки (или
None).-
cached¶
(
__cached__)Строка, указывающая, где должен храниться скомпилированный модуль (или
None).-
parent¶
(
__package__)(Только для чтения) Полное имя пакета, в котором модуль должен загружаться как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов совпадает с
__name__.-
has_location¶
Логическое значение, указывающее, относится ли атрибут «origin» модуля к загружаемому расположению.
-
importlib.util – служебный код для импортёров¶importlib.util – Utility code for importers
Исходный код: Lib/importlib/util.py
Этот модуль содержит различные объекты, помогающие в создании импортёра.
-
importlib.util.MAGIC_NUMBER¶ Байты, представляющие номер версии байт-кода. Если требуется помощь в загрузке или записи байт-кода, рекомендуется использовать
importlib.abc.SourceLoader.Новое в версии 3.4.
-
importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)¶ Возвращает путь PEP 3147/PEP 488 к скомпилированному в байт-код файлу, связанному с исходным 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).Параметр 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.Параметр debug_override устарел и может использоваться для переопределения системного значения
__debug__. ЗначениеTrueэквивалентно установке optimization в пустую строку. ЗначениеFalseаналогично установке optimization в1. Если оба debug_override и optimization не равныNone, то вызываетсяTypeError.Новое в версии 3.4.
Изменено в версии 3.5: Был добавлен параметр optimization, а параметр debug_override был объявлен устаревшим.
Изменено в версии 3.6: Принимает объект, подобный пути.
-
importlib.util.source_from_cache(path)¶ По заданному path для имени файла PEP 3147 возвращает связанный путь к файлу исходного кода. Например, если path равен
/foo/bar/__pycache__/baz.cpython-32.pyc, возвращаемый путь будет/foo/bar/baz.py. path необязательно должен существовать, однако если он не соответствует формату PEP 3147 или PEP 488, вызываетсяValueError. Еслиsys.implementation.cache_tagне определён, вызываетсяNotImplementedError.Новое в версии 3.4.
Изменено в версии 3.6: Принимает объект, подобный пути.
-
importlib.util.decode_source(source_bytes)¶ Декодирует заданные байты, представляющие исходный код, и возвращает их в виде строки с универсальными символами новой строки (как требуется в
importlib.abc.InspectLoader.get_source()).Новое в версии 3.4.
-
importlib.util.resolve_name(name, package)¶ Преобразует относительное имя модуля в абсолютное.
Если name не содержит ведущих точек, то name просто возвращается. Это позволяет использовать такие конструкции, как
importlib.util.resolve_name('sys', __spec__.parent), без проверки того, требуется ли аргумент package.ImportErrorвозбуждается, если name – относительное имя модуля, но package – ложное значение (например,Noneили пустая строка).ImportErrorтакже возбуждается, если относительное имя выходит за пределы содержащего пакета (например, запрос..baconизнутри пакетаspam).Новое в версии 3.3.
Изменено в версии 3.9: Для повышения согласованности с инструкциями import теперь вызывается
ImportErrorвместоValueErrorпри недопустимых попытках относительного импорта.
-
importlib.util.find_spec(name, package=None)¶ Находит spec для модуля, возможно, относительно указанного имени package. Если модуль находится в
sys.modules, возвращаетсяsys.modules[name].__spec__(если только spec не будетNoneили не задан, и в этом случае вызываетсяValueError). В противном случае выполняется поиск с помощьюsys.meta_path.Noneвозвращается, если spec не найден.Если name относится к подмодулю (содержит точку), родительский модуль импортируется автоматически.
name и package работают так же, как для
import_module().Новое в версии 3.4.
Изменено в версии 3.7: Вызывает
ModuleNotFoundErrorвместоAttributeError, если package на самом деле не является пакетом (т.е. не имеет атрибута__path__).
-
importlib.util.module_from_spec(spec)¶ Создаёт новый модуль на основе spec и
spec.loader.create_module.Если
spec.loader.create_moduleне возвращаетNone, то любые существующие атрибуты не будут сброшены. Кроме того,AttributeErrorне будет вызвано, если оно сработает при доступе к spec или установке атрибута модуля.Эта функция предпочтительнее использования
types.ModuleTypeдля создания нового модуля, так как spec используется для установки как можно большего количества атрибутов, управляемых импортом, на модуле.Новое в версии 3.5.
-
@importlib.util.module_for_loader¶ Декоратор для
importlib.abc.Loader.load_module()для выбора подходящего объекта модуля для загрузки. Ожидается, что декорируемый метод имеет сигнатуру вызова с двумя позиционными аргументами (например,load_module(self, module)), второй из которых будет объектом модуля для использования загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами из-за предположения о двух аргументах.Декорируемый метод будет принимать имя модуля для загрузки, как и ожидается для загрузчика. Если модуль не найден в
sys.modules, то создается новый. Независимо от того, откуда взялся модуль,__loader__устанавливается в self, а__package__устанавливается на основе того, что возвращаетimportlib.abc.InspectLoader.is_package()(если доступно). Эти атрибуты устанавливаются безусловно для поддержки перезагрузки.Если декорируемый метод вызывает исключение, а модуль был добавлен в
sys.modules, то модуль будет удален, чтобы предотвратить оставление частично инициализированного модуля вsys.modules. Если модуль уже был вsys.modules, то он остается без изменений.Изменено в версии 3.3:
__loader__и__package__автоматически устанавливаются (когда это возможно).Изменено в версии 3.4: Устанавливает
__name__,__loader____package__безусловно для поддержки перезагрузки.Устарело с версии 3.4: Механизм импорта теперь напрямую выполняет все функции, предоставляемые этой функцией.
-
@importlib.util.set_loader¶ Декоратор для
importlib.abc.Loader.load_module()для установки атрибута__loader__на возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обернутого метода (т.е.self) – это то, на что должно быть установлено__loader__.Изменено в версии 3.4: Устанавливает
__loader__, если установлен вNone, как если бы атрибут не существовал.Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.
-
@importlib.util.set_package¶ Декоратор для
importlib.abc.Loader.load_module()для установки атрибута__package__на возвращаемом модуле. Если__package__установлен и имеет значение, отличное отNone, он не будет изменен.Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.
-
importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)¶ Фабричная функция для создания экземпляра
ModuleSpecна основе загрузчика. Параметры имеют тот же смысл, что и для ModuleSpec. Функция использует доступные loader API, такие какInspectLoader.is_package(), для заполнения недостающей информации о spec.Новое в версии 3.4.
-
importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)¶ Фабричная функция для создания экземпляра
ModuleSpecна основе пути к файлу. Недостающая информация будет заполнена в спецификации с помощью API загрузчика и исходя из того, что модуль будет файловым.Новое в версии 3.4.
Изменено в версии 3.6: Принимает объект, подобный пути.
-
importlib.util.source_hash(source_bytes)¶ Возвращает хеш source_bytes в виде байтов. Файл
.pycна основе хеша включаетsource_hash()содержимого соответствующего исходного файла в свой заголовок.Добавлено в версии 3.7.
-
class
importlib.util.LazyLoader(loader)¶ Класс, который откладывает выполнение загрузчика модуля до момента обращения к атрибуту модуля.
Этот класс работает только с загрузчиками, которые определяют
exec_module(), так как требуется контроль над типом модуля, используемого для модуля. По тем же причинам методcreate_module()загрузчика должен возвращатьNoneили тип, чей атрибут__class__можно изменять, а также не использовать slots. Наконец, модули, подменяющие объект, помещённый вsys.modules, работать не будут, поскольку невозможно безопасно заменить ссылки на модуль во всём интерпретаторе; если такая подмена обнаружена, возбуждаетсяValueError.Примечание
Для проектов, где время запуска критично, этот класс позволяет минимизировать затраты на загрузку модуля, если он никогда не используется. Для проектов, где время запуска несущественно, использование этого класса настоятельно не рекомендуется, поскольку сообщения об ошибках, возникающие при загрузке, откладываются и появляются вне контекста.
Новое в версии 3.5.
Изменено в версии 3.6: Начался вызов
create_module(), удалено предупреждение о совместимости дляimportlib.machinery.BuiltinImporterиimportlib.machinery.ExtensionFileLoader.-
classmethod
factory(loader)¶ Метод класса, возвращающий вызываемый объект, который создаёт ленивый загрузчик. Предназначен для использования в ситуациях, когда загрузчик передаётся по классу, а не по экземпляру.
suffixes = importlib.machinery.SOURCE_SUFFIXES loader = importlib.machinery.SourceFileLoader lazy_loader = importlib.util.LazyLoader.factory(loader) finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))
-
classmethod
Примеры¶Examples
Программный импорт¶Importing programmatically
Для программного импорта модуля используйте importlib.import_module().
import importlib
itertools = importlib.import_module('itertools')
Проверка возможности импорта модуля¶Checking if a module can be imported
Если нужно узнать, можно ли импортировать модуль, не выполняя сам импорт, следует использовать importlib.util.find_spec().
Обратите внимание: если name является подмодулем (содержит точку), importlib.util.find_spec() импортирует родительский модуль.
import importlib.util
import sys
# Для наглядности.
name = 'itertools'
if name in sys.modules:
print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
# Если требуется выполнить фактический импорт ...
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)
print(f"{name!r} has been imported")
else:
print(f"can't find the {name!r} module")
Прямой импорт исходного файла¶Importing a source file directly
Чтобы напрямую импортировать исходный файл Python, используйте следующий рецепт (только Python 3.5 и новее):
import importlib.util
import sys
# Для наглядности.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)
Реализация ленивого импорта¶Implementing lazy imports
Пример ниже показывает, как реализовать ленивый импорт:
>>> import importlib.util
>>> import sys
>>> def lazy_import(name):
... spec = importlib.util.find_spec(name)
... loader = importlib.util.LazyLoader(spec.loader)
... spec.loader = loader
... module = importlib.util.module_from_spec(spec)
... sys.modules[name] = module
... loader.exec_module(module)
... return module
...
>>> lazy_typing = lazy_import("typing")
>>> #lazy_typing – это реальный объект модуля,
>>> #но он ещё не загружен в память.
>>> lazy_typing.TYPE_CHECKING
False
Настройка импортёра¶Setting up an importer
Для глубокой настройки импорта обычно требуется реализовать импортёр. Это означает управление как поисковиком, так и загрузчиком. Для поисковиков есть два варианта в зависимости от потребностей: поисковик по мета-пути или поисковик по записям пути. Первый помещается в sys.meta_path, а второй создаётся с помощью хука записи пути на sys.path_hooks, который работает с записями sys.path для потенциального создания поисковика. Этот пример покажет, как зарегистрировать собственные импортёры, чтобы импорт их использовал (для создания своего импортёра прочтите документацию по соответствующим классам, определённым в этом пакете):
import importlib.machinery
import sys
# Только для наглядности.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
importlib.machinery.SOURCE_SUFFIXES)
# Настройка искателя мета-пути.
# Убедитесь, что искатель помещён в правильное место в списке с точки зрения
# приоритета.
sys.meta_path.append(SpamMetaPathFinder)
# Настройка искателя точек входа пути.
# Убедитесь, что хук пути помещён в правильное место в списке с точки зрения
# приоритета.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
Аппроксимация importlib.import_module()¶Approximating importlib.import_module()
Сам импорт реализован на Python, что позволяет предоставить доступ к большей части механизма импорта через importlib. Следующий пример иллюстрирует различные API, которые предоставляет importlib, приводя приблизительную реализацию
importlib.import_module() (Python 3.4 и новее для использования importlib,
Python 3.6 и новее для остальных частей кода).
import importlib.util
import sys
def import_module(name, package=None):
"""Примерная реализация импорта."""
absolute_name = importlib.util.resolve_name(name, package)
try:
return sys.modules[absolute_name]
except KeyError:
pass
path = None
if '.' in absolute_name:
parent_name, _, child_name = absolute_name.rpartition('.')
parent_module = import_module(parent_name)
path = parent_module.__spec__.submodule_search_locations
for finder in sys.meta_path:
spec = finder.find_spec(absolute_name, path)
if spec is not None:
break
else:
msg = f'No module named {absolute_name!r}'
raise ModuleNotFoundError(msg, name=absolute_name)
module = importlib.util.module_from_spec(spec)
sys.modules[absolute_name] = module
spec.loader.exec_module(module)
if path is not None:
setattr(parent_module, child_name, module)
return module