importlib — Реализация импорта
Новое в версии 3.1.
Исходный код: Lib/importlib/__init__.py
Введение
Цель пакета importlib двойная. Первая — предоставить реализацию оператора import (и, следовательно, функции __import__()) в исходном коде Python. Это обеспечивает реализацию import, которая портативна для любого интерпретатора Python. Это также обеспечивает реализацию, которую легче понять, чем реализацию на языке программирования, отличном от Python.
Во-вторых, компоненты для реализации import представлены в этом пакете, что упрощает пользователям создание собственных пользовательских объектов (обобщенно называемых импортером), которые могут участвовать в процессе импорта.
См. также
- Оператор 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) -
Найти загрузчик для модуля, необязательно внутри указанного пути. Если модуль находится в
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. Некоторые подклассы основных абстрактных базовых классов также предоставляются для помощи в реализации основных АБК.
Иерархия АБК:
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. Этот ABC является подклассом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__ -
Родительский пакет для модуля/пакета. Если модуль находится на верхнем уровне, его значение равно пустой строке. Декоратор
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 -
Абстрактный базовый класс, предоставляющий возможность чтения ресурсов.
С точки зрения этого АБК, ресурс — это двоичный артефакт, поставляемый вместе с пакетом. Обычно это какой-либо файл данных, расположенный рядом с файлом
__init__.pyпакета. Цель этого класса — абстрагировать доступ к таким файлам данных, чтобы не было важно, хранятся ли пакет и его файлы данных в файле zip или на файловой системе.Для любого метода этого класса ожидается аргумент resource, являющийся объектом, подобным пути, который концептуально представляет только имя файла. Это означает, что в аргументе resource не должны указываться пути к подкаталогам. Это связано с тем, что расположение пакета, для которого предназначен ридер, выступает в качестве «каталога». Отсюда и метафора: каталоги и имена файлов — это пакеты и ресурсы соответственно. Также именно поэтому экземпляры этого класса должны напрямую соответствовать конкретному пакету (а не потенциально представлять несколько пакетов или модуль).
Загрузчики, желающие поддерживать чтение ресурсов, должны предоставить метод, называемый
get_resource_reader(fullname), который возвращает объект, реализующий интерфейс этого АБК. Если модуль, указанный в fullname, не является пакетом, этот метод должен возвращатьNone. Объект, совместимый с этим АБК, должен возвращаться только тогда, когда указанный модуль является пакетом.Введено в версии 3.7.
-
abstractmethod open_resource(resource) -
Возвращает открытый объект, подобный файлу, предназначенный для двоичного чтения ресурса.
Если ресурс не найден, генерируется
FileNotFoundError.
-
abstractmethod resource_path(resource) -
Возвращает путь к ресурсу в файловой системе.
Если ресурс конкретно не существует в файловой системе, генерируется
FileNotFoundError.
-
abstractmethod is_resource(name) -
Возвращает
True, если указанное имя name считается ресурсом. Если name не существует, генерируетсяFileNotFoundError.
-
abstractmethod contents() -
Возвращает итерируемый объект строк, содержащих содержимое пакета. Обратите внимание, что не требуется, чтобы все имена, возвращаемые итератором, были фактическими ресурсами, например, допустимо возвращать имена, для которых
is_resource()было бы ложью.Допускается возвращать имена, не являющиеся ресурсами, для ситуаций, когда известны способ хранения пакета и его ресурсов, и имена, не являющиеся ресурсами, могут быть полезными. Например, возвращение имён подкаталогов допускается, чтобы, когда известно, что пакет и ресурсы хранятся в файловой системе, эти имена подкаталогов можно было использовать напрямую.
Абстрактный метод возвращает итерируемый объект без элементов.
-
-
class importlib.abc.ResourceLoader -
Абстрактный базовый класс для загрузчика, который реализует необязательный протокол PEP 302 для загрузки произвольных ресурсов из хранилища.
Устарел начиная с версии 3.7: Этот АБК устарел в пользу поддержки загрузки ресурсов через
importlib.abc.ResourceReader.-
abstractmethod get_data(path) -
Абстрактный метод для возвращения байтов данных, расположенных по адресу path. Загрузчики, имеющие файловое хранилище, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод для прямого доступа к хранимым данным. Если path не найден, должно генерироваться
OSError. Ожидается, что 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) -
Абстрактный метод для возвращения значения true, если модуль является пакетом, и false в противном случае. Генерирует
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__.
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.open_binary(package, resource) -
Открыть для двоичного чтения ресурс в пакете.
Пакет — это имя или объект модуля, который соответствует требованиям
Package. Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом). Эта функция возвращает экземплярtyping.BinaryIO, двоичный поток ввода-вывода, открытый для чтения.
-
importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict') -
Открыть для текстового чтения ресурс в пакете. По умолчанию ресурс открывается для чтения как UTF-8.
Пакет — это имя или объект модуля, который соответствует требованиям
Package. Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом). encoding и errors имеют такое же значение, как и при использовании встроенной функцииopen().Эта функция возвращает экземпляр
typing.TextIO, текстовый поток ввода-вывода, открытый для чтения.
-
importlib.resources.read_binary(package, resource) -
Прочитать и вернуть содержимое ресурса в пакете как
bytes.Пакет — это имя или объект модуля, который соответствует требованиям
Package. Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом). Эта функция возвращает содержимое ресурса какbytes.
-
importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict') -
Прочитать и вернуть содержимое ресурса в пакете как
str. По умолчанию содержимое читается как строгий UTF-8.Пакет — это имя или объект модуля, который соответствует требованиям
Package. Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом). encoding и errors имеют такое же значение, как и при использовании встроенной функцииopen(). Эта функция возвращает содержимое ресурса какstr.
-
importlib.resources.path(package, resource) -
Возвращает путь к ресурсу как фактический путь в файловой системе. Эта функция возвращает менеджер контекста для использования в операторе
with. Менеджер контекста предоставляет объектpathlib.Path.Выход из менеджера контекста очищает все временные файлы, созданные при необходимости извлечения ресурса, например, из zip-файла.
Пакет — это имя или объект модуля, который соответствует требованиям
Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом).Package.
-
importlib.resources.is_resource(package, name) -
Возвращает
True, если в пакете есть ресурс с именем name, в противном случаеFalse. Помните, что каталоги — это не ресурсы! Пакет — это имя или объект модуля, который соответствует требованиямPackage.
-
importlib.resources.contents(package) -
Возвращает итерируемый объект над именованными элементами внутри пакета. Итерируемый объект возвращает
strресурсы (например, файлы) и не-ресурсы (например, каталоги). Итерируемый объект не рекурсивно входит в подкаталоги.Пакет — это имя или объект модуля, который соответствует требованиям
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 -
Импортер для модулей из замороженных библиотек. Этот класс реализует абстрактные классы
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) -
Метод класса, пытающийся найти описание модуля (spec) для модуля, указанного 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 — это переменное количество кортежей из двух элементов, каждый из которых содержит импортер и последовательность расширений файлов, распознаваемых импортером. Импортеры должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.
Поисковик будет кэшировать содержимое каталога по мере необходимости, вызывая stat для каждого поиска модуля, чтобы проверить, не устарел ли кэш. Поскольку устаревание кэша зависит от гранулярности информации операционной системы о состоянии файловой системы, существует потенциальная гонка при поиске модуля, создании нового файла и последующем поиске модуля, представленного новым файлом. Если операции происходят достаточно быстро, чтобы уместиться в гранулярности вызовов stat, поиск модуля завершится неудачно. Чтобы предотвратить это, при динамическом создании модуля убедитесь, что вы вызываете
importlib.invalidate_caches().Добавлена в версии 3.3.
-
path -
Путь, в котором будет производиться поиск.
-
find_spec(fullname, target=None) -
Попытка найти описание (spec) для обработки 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__)Загрузчик для использования при загрузке. Для пакетов пространства имён это должно быть установлено в
None.-
origin
(
__file__)Имя места, откуда загружается модуль, например, «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно «origin» должен быть установлен, но он может быть
None(значение по умолчанию), что указывает на то, что он не указан (например, для пакетов пространства имён).-
submodule_search_locations
(
__path__)Список строк для поиска подмодулей, если это пакет (
Noneв противном случае).-
loader_state
Контейнер с дополнительными данными, специфичными для модуля, для использования во время загрузки (или
None).-
cached
(
__cached__)Строка, обозначающая место хранения скомпилированного модуля (или
None).-
parent
(
__package__)(Только для чтения) Полное квалифицированное имя пакета, к которому относится модуль как подмодуль (или
None).-
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 не заданы, то будет поднята ошибка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', __package__)без проверки необходимости аргумента package.Если name — относительное имя модуля, а package имеет ложное значение (например,
Noneили пустую строку), будет поднята ошибкаValueError. Также будет поднята ошибкаValueError, если относительное имя выйдет за пределы содержащего пакета (например, запрос..baconизнутри пакетаspam).Добавлена в версии 3.3.
-
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 -
А декоратор для
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().
import importlib.util
import sys
# For illustrative purposes.
name = 'itertools'
spec = importlib.util.find_spec(name)
if spec is None:
print("can't find the itertools module")
else:
# If you chose to perform the actual import ...
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Adding the module to sys.modules is optional.
sys.modules[name] = 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) spec.loader.exec_module(module) # Optional; only necessary if you want to be able to import the module # by name later. sys.modules[module_name] = 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)
spec.loader.exec_module(module)
sys.modules[absolute_name] = module
if path is not None:
setattr(parent_module, child_name, module)
return module
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/importlib.html