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и квалифицированные имена (модуль.имя).Если модуль создаёт экземпляры класса, перезагрузка модуля, который определяет класс, не влияет на определения методов экземпляров — они продолжают использовать старое определение класса. То же самое относится к производным классам.
Введено в версии 3.4.
Изменено в версии 3.7: Возникает
ModuleNotFoundError, если модуль, который перезагружается, не имеетModuleSpec. - Код модуля Python перекомпилируется, и код уровня модуля выполняется повторно, определяются новые объекты, которые привязаны к именам в словаре модуля, используя загрузчик, который изначально загрузил модуль. Функция
importlib.abc – Абстрактные базовые классы, связанные с импортом
Исходный код: Lib/importlib/abc.py
Модуль importlib.abc содержит все основные абстрактные базовые классы, используемые модулем import. Также предоставляются некоторые подклассы основных абстрактных базовых классов для помощи в реализации основных АБК.
Иерархия АБК:
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.
-
-
class importlib.abc.MetaPathFinder -
Абстрактный базовый класс, представляющий поисковик метапути. Для совместимости это подкласс
Finder.Введено в версии 3.3.
-
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предназначен для использования только внутри подсистемы импорта на основе пути, предоставляемойPathFinder. Этот АБК является подклассомFinderтолько по соображениям совместимости.Введено в версии 3.3.
-
find_spec(fullname, target=None) -
Абстрактный метод для поиска спецификации для указанного модуля. Поисковик будет искать модуль только в записи пути, которому он назначен. Если спецификация не найдена, возвращается
None. При передаче в качестве параметраtarget— это объект модуля, который поисковик может использовать для более точного предположения о том, какую спецификацию вернуть.importlib.util.spec_from_loader()может быть полезен для реализации конкретныхPathEntryFinders.Введено в версии 3.4.
-
find_loader(fullname) -
Легасный метод для поиска загрузчика для указанного модуля. Возвращает 2-кортеж
(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() -
Необязательный метод, который при вызове должен очистить кэш, используемый поисковиком. Используется
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) -
Метод устаревшего стиля, который, если реализован, вычисляет и возвращает строку представления данного модуля. Представление по умолчанию типа модуля будет использовать результат этого метода соответствующим образом.
Добавлена в версии 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.
Аргумент данные может быть тем, что поддерживает функция
compile()(т. е. строка или байты). Аргумент путь должен быть «путем», откуда происходит исходный код, что может быть абстрактной концепцией (например, расположение в файле 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, подходящих для обхода каталогов и открытия файлов.
Новое в версии 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 в формате текста.
-
-
class importlib.abc.TraversableResources -
Абстрактный базовый класс для читателей ресурсов, способных обслуживать интерфейс
files. Подклассы ResourceReader и предоставляют конкретные реализации абстрактных методов ResourceReader. Поэтому любой загрузчик, предоставляющий TraversableReader, также предоставляет ResourceReader.Новое в версии 3.9.
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.resources.abc.Traversable, представляющий контейнер ресурсов для пакета (подумайте о каталоге) и его ресурсов (подумайте о файлах). Traversable может содержать другие контейнеры (подумайте о подкаталогах).package — это либо имя, либо объект модуля, который соответствует требованиям
Package.Новое в версии 3.9.
-
importlib.resources.as_file(traversable) -
Учитывая объект
importlib.resources.abc.Traversable, представляющий файл, обычно изimportlib.resources.files(), возвращает менеджер контекста для использования в инструкцииwith. Менеджер контекста предоставляет объектpathlib.Path.Выход из менеджера контекста очищает любой временный файл, созданный при извлечении ресурса из, например, zip-файла.
Используйте
as_file, когда методы Traversable (read_text, и т. д.) недостаточны и требуется фактический файл в файловой системе.Новое в версии 3.9.
-
importlib.resources.open_binary(package, resource) -
Открывает для двоичного чтения ресурс resource внутри package.
package — это либо имя, либо объект модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри package; оно не может содержать разделители путей и не может иметь подресурсы (то есть не может быть каталогом). Эта функция возвращает экземплярtyping.BinaryIO, двоичный поток ввода/вывода, открытый для чтения.
-
importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict') -
Открывает для чтения текста ресурс resource внутри package. По умолчанию ресурс открывается для чтения в кодировке UTF-8.
package — это либо имя, либо объект модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри package; оно не может содержать разделители путей и не может иметь подресурсы (то есть не может быть каталогом). encoding и errors имеют то же значение, что и в встроенной функцииopen().Эта функция возвращает экземпляр
typing.TextIO, поток ввода/вывода текста, открытый для чтения.
-
importlib.resources.read_binary(package, resource) -
Читает и возвращает содержимое ресурса resource внутри package в формате
bytes.package — это либо имя, либо объект модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри package; оно не может содержать разделители путей и не может иметь подресурсы (то есть не может быть каталогом). Эта функция возвращает содержимое ресурса какbytes.
-
importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict') -
Читает и возвращает содержимое ресурса resource внутри package в виде
str. По умолчанию содержимое читается как строгая UTF-8.package — это либо имя, либо объект модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри package; оно не может содержать разделители путей и не может иметь подресурсы (то есть не может быть каталогом). encoding и errors имеют то же значение, что и в встроенной функцииopen(). Эта функция возвращает содержимое ресурса какstr.
-
importlib.resources.path(package, resource) -
Возвращает путь к ресурсу resource как фактический путь в файловой системе. Эта функция возвращает менеджер контекста для использования в инструкции
with. Менеджер контекста предоставляет объектpathlib.Path.Выход из менеджера контекста очищает любой временный файл, созданный при необходимости извлечения ресурса, например, из zip-файла.
package — это либо имя, либо объект модуля, который соответствует требованиям
Package. resource — имя ресурса для открытия внутри package; оно не может содержать разделители путей и не может иметь подресурсы (то есть не может быть каталогом).
-
importlib.resources.is_resource(package, name) -
Возвращает
True, если в пакете есть ресурс с именем name, иначеFalse. Помните, что каталоги — не ресурсы! package — это либо имя, либо объект модуля, который соответствует требованиямPackage.
-
importlib.resources.contents(package) -
Возвращает итерируемый объект по именованным элементам внутри пакета. Итерируемый объект возвращает
strресурсы (например, файлы) и нересурсы (например, каталоги). Итерируемый объект не рекурсивно входит в подкаталоги.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. Этот класс реализует ABCimportlib.abc.MetaPathFinderиimportlib.abc.InspectLoader.В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.
Изменено в версии 3.5: В рамках PEP 489 встроенный импортер теперь реализует
Loader.create_module()иLoader.exec_module()
-
class importlib.machinery.FrozenImporter -
Импортер для модулей, закодированных во фреймворк. Этот класс реализует ABC
importlib.abc.MetaPathFinderиimportlib.abc.InspectLoader.В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.
Изменено в версии 3.4: Получил методы
create_module()иexec_module().
-
class importlib.machinery.WindowsRegistryFinder -
Находит модули, объявленные в реестре Windows. Этот класс реализует ABC
importlib.abc.MetaPathFinder.В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.
Добавлен в версии 3.3.
Устарело начиная с версии 3.6: Используйте настройки
siteвместо этого. Будущие версии Python могут не включать этого нахождения по умолчанию.
-
class importlib.machinery.PathFinder -
Находит модули в
sys.pathи атрибутах пакета__path__. Этот класс реализует ABCimportlib.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с текущей рабочей директорией для''(то есть пустой строкой). -
-
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.
-
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 -
Путь к исходному файлу.
-
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, если путь к файлу указывает на пакетный модуль__init__в соответствии с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: Для повышения согласованности с операторами импорта, вместо
ValueErrorиспользуется исключениеImportErrorдля неверных попыток относительного импорта.
-
importlib.util.find_spec(name, package=None) -
Находит спецификацию модуля, необязательно относительно указанного имени пакета 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 -
A декоратор для
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 -
A декоратор для
importlib.abc.Loader.load_module()для установки атрибута__loader__на возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обернутого метода (т.е.self) - это то, что должно быть установлено в__loader__.Изменено в версии 3.4: Устанавливается
__loader__если оно установлено вNone, как если бы атрибут не существовал.Устарело начиная с версии 3.4: Механизм импорта теперь выполняет это автоматически.
-
@importlib.util.set_package -
A декоратор для
importlib.abc.Loader.load_module()для установки атрибута__package__на возвращаемом модуле. Если__package__установлен и имеет значение отличное отNone, он не будет изменён.Устарело начиная с версии 3.4: Механизм импорта теперь выполняет это автоматически.
-
importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None) -
A factory function for creating a
ModuleSpecinstance based on a loader. The parameters have the same meaning as they do for ModuleSpec. The function uses available loader APIs, such asInspectLoader.is_package(), to fill in any missing information on the spec.New in version 3.4.
-
importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None) -
A factory function for creating a
ModuleSpecinstance based on the path to a file. Missing information will be filled in on the spec by making use of loader APIs and by the implication that the module will be file-based.New in version 3.4.
Изменено в версии 3.6: Принимает объект, подобный пути.
-
importlib.util.source_hash(source_bytes) -
Return the hash of source_bytes as bytes. A hash-based
.pycfile embeds thesource_hash()of the corresponding source file’s contents in its header.New in version 3.7.
-
class importlib.util.LazyLoader(loader) -
A class which postpones the execution of the loader of a module until the module has an attribute accessed.
This class only works with loaders that define
exec_module()as control over what module type is used for the module is required. For those same reasons, the loader’screate_module()method must returnNoneor a type for which its__class__attribute can be mutated along with not using слоты. Finally, modules which substitute the object placed intosys.moduleswill not work as there is no way to properly replace the module references throughout the interpreter safely;ValueErroris raised if such a substitution is detected.Примечание
Для проектов, где время запуска имеет критическое значение, этот класс позволяет потенциально минимизировать затраты на загрузку модуля, если он никогда не используется. Для проектов, где время запуска не является существенным, использование этого класса сильно не рекомендуется из-за сообщений об ошибках, созданных во время загрузки, которые откладываются и, таким образом, появляются вне контекста.
New in version 3.5.
Изменено в версии 3.6: Начал вызывать
create_module(), убрав предупреждение о совместимости дляimportlib.machinery.BuiltinImporterиimportlib.machinery.ExtensionFileLoader.-
classmethod factory(loader) -
A static method which returns a callable that creates a lazy loader. This is meant to be used in situations where the loader is passed by class instead of by instance.
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().
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)
Настройка импортера
Для глубокой настройки импорта обычно необходимо реализовать импортер. Это означает управление как поисковиком, так и загрузчиком. Для поисковиков доступны два варианта в зависимости от ваших потребностей: мета-путевой поисковик или поисковик по элементам пути. Первый размещается на 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/importlib.html