importlib — Реализация импорта
В версии 3.1.
Исходный код: Lib/importlib/__init__.py
Введение
Цель пакета importlib двояка. Одна — предоставить реализацию оператора import (и, следовательно, функции __import__()) в исходном коде Python. Это обеспечивает реализацию import, которая портативна для любого интерпретатора Python. Это также предоставляет реализацию, которая легче понять, чем реализация на языке программирования, отличном от Python.
Во-вторых, компоненты для реализации оператора import представлены в этом пакете, что упрощает пользователям создание собственных пользовательских объектов (обобщённо известных как импортер) для участия в процессе импорта.
См. также
- Оператор импорта
-
Справочная информация по языку для оператора
import. - Спецификация пакетов
-
Исходная спецификация пакетов. Некоторые семантические изменения произошли со времени написания этого документа (например, перенаправление на основе
Noneвsys.modules). -
The __import__() function -
Оператор
importявляется синтаксическим сахаром для этой функции. - PEP 235
-
Импорт на платформах с регистронезависимыми именами
- PEP 263
-
Определение кодировок исходного кода Python
- PEP 302
-
Новые хуки импорта
- PEP 328
-
Импорты: многострочные и абсолютные/относительные
- PEP 366
-
Явные относительные импорты модуля main
- PEP 420
-
Неявные пакеты пространств имён
- PEP 451
-
Тип ModuleSpec для системы импорта
- PEP 488
-
Устранение файлов PYO
- PEP 489
-
Инициализация модулей расширений в несколько этапов
- PEP 552
-
Детерминированные pycs
- PEP 3120
-
Использование UTF-8 в качестве стандартной кодировки исходного кода
- PEP 3147
-
Директории репозиториев PYC
Функции
-
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. - Код модуля Python перекомпилируется, а код модуля повторно выполняется, определяя новый набор объектов, которые связываются с именами в словаре модуля, повторно используя загрузчик, который изначально загрузил модуль. Функция
importlib.abc – Абстрактные базовые классы, связанные с импортом
Исходный код: 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()вместо этого.
-
-
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
Абстрактный базовый класс для чтения ресурсов.
С точки зрения этого АБК, ресурс — это двоичный артефакт, входящий в состав пакета. Обычно это какой-либо текстовый или двоичный файл, расположенный рядом с файлом
__init__.pyпакета. Цель этого класса — абстрагировать доступ к таким файлам, чтобы не имело значения, хранятся ли пакет и его файлы в архиве zip или на файловой системе.Для любых методов этого класса ожидается, что аргумент ресурс будет объектом типа объект-путь, который концептуально представляет только имя файла. Это означает, что в аргументе ресурс не должны включаться пути к подкаталогам. Это потому, что расположение пакета, для которого предназначен читатель, выступает в качестве «каталога». Отсюда метафора каталогов и имён файлов как пакетов и ресурсов соответственно. Также именно поэтому экземпляры этого класса ожидают прямое соответствие определённому пакету (вместо потенциального представления нескольких пакетов или модуля).
Загрузчики, которые хотят поддерживать чтение ресурсов, должны предоставить метод
get_resource_reader(fullname), который возвращает объект, реализующий интерфейс этого АБК. Если модуль, указанный параметром fullname, не является пакетом, этот метод должен возвращатьNone. Объект, совместимый с этим АБК, должен возвращаться только тогда, когда указанный модуль является пакетом.Новая версия 3.7.
-
abstractmethod open_resource(resource) -
Возвращает открытый объект типа объект-поток для двоичного чтения ресурса.
Если ресурс не найден, возникает ошибка
FileNotFoundError.
-
abstractmethod resource_path(resource) -
Возвращает путь к ресурсу в файловой системе.
Если ресурс конкретно не существует в файловой системе, поднимите ошибку
FileNotFoundError.
-
abstractmethod is_resource(name) -
Возвращает
True, если указанное имя name считается ресурсом.FileNotFoundErrorвозникает, если name не существует.
-
abstractmethod contents() -
Возвращает итератор строк по содержимому пакета. Обратите внимание, что не требуется, чтобы все имена, возвращаемые итератором, были фактическими ресурсами, например, допустимо возвращать имена, для которых
is_resource()было бы ложным.Разрешение возвращать имена, которые не являются ресурсами, позволяет учитывать ситуации, когда способ хранения пакета и его ресурсов известен заранее, и имена, которые не являются ресурсами, будут полезны. Например, разрешается возвращать имена подкаталогов, чтобы при известном хранении пакета и ресурсов на файловой системе можно было напрямую использовать эти имена подкаталогов.
Абстрактный метод возвращает итератор без элементов.
-
-
class importlib.abc.ResourceLoader -
Абстрактный базовый класс для загрузчика, который реализует необязательный протокол PEP 302 для загрузки произвольных ресурсов из хранилища.
Устарело начиная с версии 3.7: Этот АБК устарел в пользу поддержки загрузки ресурсов с помощью
importlib.abc.ResourceReader.-
abstractmethod get_data(path) -
Абстрактный метод для возврата байтов данных, расположенных по пути path. Загрузчики, имеющие хранилище в виде потока, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод, чтобы предоставить прямой доступ к хранящимся данным.
OSErrorдолжен быть вызван, если путь path не найден. Ожидается, что путь path будет построен с использованием атрибута модуля__file__или элемента из атрибута пакета__path__.Изменено в версии 3.4: Возвращает
OSErrorвместоNotImplementedError.
-
-
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.
-
-
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_filename(fullname) -
Возвращает
path.
-
abstractmethod get_data(path) -
Читает файл path в бинарном формате и возвращает полученные байты.
-
-
class importlib.abc.SourceLoader -
Абстрактный базовый класс для реализации загрузки файлов с исходным кодом (и, необязательно, байткодом). Класс наследуется как от
ResourceLoader, так и отExecutionLoaderи требует реализации:ResourceLoader.get_data()-
-
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. -
-
class importlib.abc.TraversableResources -
Абстрактный базовый класс для читателей ресурсов, способных обслуживать интерфейс
files. Подклассы ResourceReader и предоставляют конкретные реализации абстрактных методов ResourceReader. Таким образом, любой загрузчик, предоставляющий TraversableResources, также предоставляет ResourceReader.Ожидается, что загрузчики, желающие поддерживать чтение ресурсов, будут реализовывать этот интерфейс.
Новое в версии 3.9.
Примечание: В Python 3.11 и более поздних версиях этот класс находится в
importlib.resources.abc.
importlib.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 — имя ресурса для открытия внутри пакета; оно не может содержать разделители путей и не может иметь подресурсы (т. е. не может быть каталогом). Эта функция возвращает экземплярtyping.BinaryIO, двоичный поток ввода-вывода, открытый для чтения.
-
importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict') -
Открыть для текстового чтения ресурс внутри пакета. По умолчанию ресурс открывается для чтения в кодировке UTF-8.
package может быть именем или объектом модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри пакета; оно не может содержать разделители путей и не может иметь подресурсы (т. е. не может быть каталогом). encoding и errors имеют то же значение, что и в встроенной функцииopen().Эта функция возвращает экземпляр
typing.TextIO, текстовый поток ввода-вывода, открытый для чтения.
-
importlib.resources.read_binary(package, resource) -
Прочитать и вернуть содержимое ресурса внутри пакета как
bytes.package может быть именем или объектом модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри пакета; оно не может содержать разделители путей и не может иметь подресурсы (т. е. не может быть каталогом). Эта функция возвращает содержимое ресурса какbytes.
-
importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict') -
Прочитать и вернуть содержимое ресурса внутри пакета как
str. По умолчанию содержимое читается как строго UTF-8.package может быть именем или объектом модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри пакета; оно не может содержать разделители путей и не может иметь подресурсы (т. е. не может быть каталогом). encoding и errors имеют то же значение, что и в встроенной функцииopen(). Эта функция возвращает содержимое ресурса какstr.
-
importlib.resources.path(package, resource) -
Вернуть путь к ресурсу как фактический путь в файловой системе. Эта функция возвращает менеджер контекста для использования в операторе
with. Менеджер контекста предоставляет объектpathlib.Path.Выход из менеджера контекста очищает любые временные файлы, созданные при необходимости извлечения ресурса, например, из файла zip.
package может быть именем или объектом модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри пакета; оно не может содержать разделители путей и не может иметь подресурсы (т. е. не может быть каталогом).
-
importlib.resources.is_resource(package, name) -
Возвращает
True, если в пакете есть ресурс с именем name, в противном случаеFalse. Помните, что каталоги — не ресурсы! package может быть именем или объектом модуля, который соответствует требованиямPackage.
-
importlib.resources.contents(package) -
Возвращает итерируемый объект по именованным элементам внутри пакета. Итерируемый объект возвращает строковые ресурсы (например, файлы) и не-ресурсы (например, каталоги). Итерируемый объект не рекурсивно входит в подкаталоги.
package может быть именем или объектом модуля, который соответствует требованиям
Package.
importlib.machinery – Импортёры и обработчики путей
Исходный код: 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 -
Поисковик модулей, объявленных в реестре 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. Если найдено ненулевое значение, то оно используется в качестве поисковика для вхождения пути, чтобы найти искомый модуль. Если в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с текущей рабочей директорией для''(т. е. пустой строкой). -
-
class importlib.machinery.FileFinder(path, *loader_details) -
Конкретная реализация
importlib.abc.PathEntryFinder, которая кэширует результаты из файловой системы.Аргумент path — это директория, за поиск в которой отвечает данный поиск.
Аргумент loader_details — это переменное количество пар кортежей по 2 элемента, каждая из которых содержит загрузчик и последовательность расширений файлов, распознаваемых этим загрузчиком. От загрузчиков ожидается, что они будут вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.
Поиск будет кэшировать содержимое директории по мере необходимости, выполняя вызовы 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возвращается замыканием, используя аргумент пути, переданный замыканию непосредственно, и loader_details косвенно.Если аргумент замыкания не является существующей директорией, возникает
ImportError.
-
-
class importlib.machinery.SourceFileLoader(fullname, path) -
Конкретная реализация
importlib.abc.SourceLoaderпутём наследования отimportlib.abc.FileLoaderи предоставлением конкретных реализаций других методов.Новое в версии 3.3.
-
name -
Имя модуля, который будет обрабатываться этим загрузчиком.
-
path -
Путь к файлу исходного кода.
-
is_package(fullname) -
Возвращает
Trueесли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 -
Путь к файлу байткода.
-
is_package(fullname) -
Определяет, является ли модуль пакетом на основе
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, если путь к файлу указывает на модуль пакета, основанный наEXTENSION_SUFFIXES.
-
get_code(fullname) -
Возвращает
None, так как модулям расширения не хватает объекта кода.
-
get_source(fullname) -
Возвращает
None, так как модули расширения не имеют исходного кода.
-
get_filename(fullname) -
Возвращает
path.Новое в версии 3.4.
-
-
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 – Утилитарный код для импортёров
Исходный код: 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взята из текущего магического тега (см.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) -
Учитывая путь к имени файла 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.Если name является относительным именем модуля, но package имеет ложное значение (например,
Noneили пустая строка), поднимается ошибкаImportError. ОшибкаImportErrorтакже поднимается, если относительное имя выйдет за пределы содержащего пакета (например, запрос..baconизнутри пакетаspam).Введено в версии 3.3.
Изменено в версии 3.9: Для повышения согласованности с операторами импорта, поднимается
ImportErrorвместоValueErrorдля некорректных попыток относительного импорта.
-
importlib.util.find_spec(name, package=None) -
Находит спецификацию spec модуля, необязательно относительно указанного имени package. Если модуль находится в
sys.modules, возвращаетсяsys.modules[name].__spec__(если спецификация была быNoneили не была установлена, то поднимается ошибкаValueError). В противном случае поиск выполняется с использованиемsys.meta_path. Если спецификация не найдена, возвращаетсяNone.Если 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. Функция использует доступные API загрузчика, такие какInspectLoader.is_package(), для заполнения любой недостающей информации в спецификации.Добавлена в версии 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))
-
Примеры
Программный импорт
Для программного импорта модуля используйте importlib.import_module().
import importlib
itertools = importlib.import_module('itertools')
Проверка возможности импорта модуля
Если вам нужно узнать, можно ли импортировать модуль, не производя сам импорт, используйте importlib.util.find_spec().
Обратите внимание, что если name является подмодулем (содержит точку), importlib.util.find_spec() импортирует родительский модуль.
import importlib.util
import sys
# For illustrative purposes.
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:
# If you chose to perform the actual import ...
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")
Прямой импорт исходного файла
Для прямого импорта файла Python используйте следующий способ (только Python 3.5 и новее):
import importlib.util import sys # For illustrative purposes. 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)
Реализация ленивых импортов
В примере ниже показано, как реализовать ленивые импорты:
>>> 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 is a real module object,
>>> #but it is not loaded in memory yet.
>>> lazy_typing.TYPE_CHECKING
False
Настройка импортера
Для глубокой кастомизации импорта, как правило, необходимо реализовать импортер. Это означает управление как поисковиком, так и загрузчиком. Для поисковиков есть два варианта в зависимости от ваших потребностей: поисковик мета-пути или поисковик элемента пути. Первый вариант помещается в sys.meta_path, а второй создаётся с помощью обработчика элемента пути в sys.path_hooks, который работает с записями в sys.path, чтобы потенциально создать поисковик. Этот пример покажет, как зарегистрировать собственные импортеры, чтобы импорт их использовал (для создания собственного импортера прочитайте документацию соответствующих классов, определённых в этом пакете):
import importlib.machinery
import sys
# For illustrative purposes only.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
importlib.machinery.SOURCE_SUFFIXES)
# Setting up a meta path finder.
# Make sure to put the finder in the proper location in the list in terms of
# priority.
sys.meta_path.append(SpamMetaPathFinder)
# Setting up a path entry finder.
# Make sure to put the path hook in the proper location in the list in terms
# of priority.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
Приблизительная реализация 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):
"""An approximate implementation of import."""
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
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/importlib.html