importlib
— Реализация import
¶
Добавлено в версии 3.1.
Исходный код: Lib/importlib/__init__.py
Введение¶
Назначение пакета importlib
- двухкратное. Нужно обеспечить внедрение
import
инструкция (и таким образом, следовательно, функция __import__()
) в
источнике Python код. Это обеспечивает реализацию import
,
которая переносится на любой Python интерпретатор. Это также обеспечивает
реализацию, которую легче понять, чем реализацию на языке программирования,
отличном от Python.
Во-вторых, компоненты для реализации import
представлены в этом пакете, что
упрощает пользователям создание собственных пользовательских объектов (обычно
называемых импортерами) для участия в процессе импорта.
См.также
- Оператор import
- Справочник по языку для
import
инструкция. - Packages specification
- Оригинальная спецификация пакетов. Некоторые семантики изменились
с момента написания этого документа (например, перенаправление на основе
None
вsys.modules
). - Функция
__import__()
import
инструкция является синтаксическим сахаром для этой функции.- PEP 235
- Импорт на платформах без учета регистра
- PEP 263
- Определяющий кодировки исходного кода Python
- PEP 302
- Новые хуки импорта
- PEP 328
- Импорт: многострочный и абсолютный/относительный
- PEP 366
- Основной модуль явный относительный импорт
- PEP 420
- Неявные пакеты пространства имен
- PEP 451
- Тип ModuleSpec для системы импорта
- PEP 488
- Исключение файлов PYO
- PEP 489
- Инициализация модуля многофазного расширения
- PEP 552
- Детерминированный 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)¶ Перезагрузить ранее импортированный 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
. Некоторые подклассы основных абстрактных базовых классов также
обеспечены, чтобы помочь в осуществлении основного ABCs.
Иерархия ABC:
object
+-- Finder (deprecated)
| +-- MetaPathFinder
| +-- PathEntryFinder
+-- Loader
+-- ResourceLoader --------+
+-- InspectLoader |
+-- ExecutionLoader --+
+-- FileLoader
+-- SourceLoader
-
class
importlib.abc.
Finder
¶ Абстрактный базовый класс, представляющий поисковик.
Не рекомендуется, начиная с версии 3.3: Вместо этого используйте
MetaPathFinder
илиPathEntryFinder
.-
abstractmethod
find_module
(fullname, path=None)¶ Абстрактный метод поиска загрузчик для указанного модуля. Первоначально указанный в PEP 302, этот метод предназначался для использования в
sys.meta_path
и в подсистеме импорта на основе путей.Изменено в версии 3.4: Возвращает значение
None
при вызове вместо повышения значенияNotImplementedError
.
-
abstractmethod
-
class
importlib.abc.
MetaPathFinder
¶ Абстрактный базовый класс, представляющий поисковик мета-пути. Для совместимости это подкласс
Finder
.Добавлено в версии 3.3.
-
find_spec
(fullname, path, target=None)¶ Абстрактный метод поиска спецификации для указанного модуля. Если это импорт верхнего уровня, path будет
None
. Иначе это - поиск подпакета или модуля, и path будет значение__path__
от родительского пакета. Если spec не может быть найден,None
является возвращенный. При передаче,target
- это объект модуля, который поисковик может использовать, чтобы сделать более образованное предположение о том, что spec возвращает .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)¶ Абстрактный метод поиска спецификации для указанного модуля. Поиск модуля будет выполняться только в пределах путей входа, которому он назначен. Если spec не может быть найден,
None
является возвращенный. При передаче,target
- это объект модуля, который поисковик может использовать, чтобы сделать более образованное предположение о том, что spec возвращает .importlib.util.spec_from_loader()
может быть полезным для реализации конкретныхPathEntryFinders
.Добавлено в версии 3.4.
-
find_loader
(fullname)¶ Устаревший метод для нахождения загрузчика для указанного модуля. Возвращает 2-кортеж
(loader, portion)
, гдеportion
- последовательность расположений файловой системы, вносящих вклад в часть пакета пространства имен. Загрузчик может бытьNone
при указанииportion
для обозначения вклада расположений файловой системы в пакет пространства имен. Пустой список может быть используемый дляportion
, чтобы показать, что погрузчик не часть пакета пространства имен. Еслиloader
isNone
и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)¶ Устаревший метод, который при реализации вычисляет и возвращает rep данного модуля в виде строка. Тип модуля repr () по умолчанию будет использовать результат этого метода.
Добавлено в версии 3.3.
Изменено в версии 3.4: Сделал необязательным вместо абстрактметода.
Не рекомендуется, начиная с версии 3.4: Импортный механизм теперь позаботится об этом автоматически.
-
-
class
importlib.abc.
ResourceReader
¶ Абстрактный базовый класс для обеспечения возможности чтения resources.
С точки зрения этой ABC, resource - это бинарный артефакт, который поставляется внутри пакета. Как правило, это файл данных, который находится рядом с файлом
__init__.py
пакета. Целью этого класса является содействие абстрагированию доступа к таким файлам данных, чтобы не было значения, хранятся ли пакет и его файлы данных, например, в zip-файле, а не в файловой системе.Для любого из методов этого класса ожидается, что аргумент resource будет путеподобный объект, который концептуально представляет только имя файла. Это означает, что пути подкаталогов не должны включаться в аргумент resource. Это связано с тем, что расположение пакета, для которого установлено считывающее устройство, действует как «каталог». Поэтому метафорой каталогов и имен файлов являются пакеты и ресурсы соответственно. Поэтому ожидается, что сущности этого класса будут непосредственно соотноситься с определенным пакетом (вместо возможного представления нескольких пакетов или модуля).
Ожидается, что загрузчики, которые хотят поддерживать считывание ресурсов, предоставят метод с именем
get_resource_reader(fullname)
, который возвращаетобъект, реализующий интерфейс этого ABC. Если модуль, определенный fullname, не является пакетом, этот метод должен возвращаетNone
. Объект, совместимый с этим ABC, должен быть возвращенный только в том случае, если указанный модуль является пакетом.Добавлено в версии 3.7.
-
abstractmethod
open_resource
(resource)¶ Возвращает открытый файлоподобный объект для двоичного чтения resource.
Если ресурс не может быть найден, возникает сообщение
FileNotFoundError
.
-
abstractmethod
resource_path
(resource)¶ Возвращает путь файловой системы к resource.
Если ресурс конкретно не существует в файловой системе, поднимите
FileNotFoundError
.
-
abstractmethod
is_resource
(name)¶ Возвращает значение
True
, если именованный name считается ресурсом.FileNotFoundError
вызывается, если name не существует.
-
abstractmethod
contents
()¶ Возвращает итерируемую строку над содержимым пакета. Обратите внимание, что не требуется, что все имена возвращенный iterator быть фактическими ресурсами, например, это приемлемо для имен возвращает , для которых
is_resource()
был бы ложным.Разрешение имен нересурса быть возвращенный должно допускать ситуации, где, как пакет и его ресурсы сохранены, известны априорно, и имена нересурса были бы полезны. Для сущность допускается возврат имен подкаталогов, так что, когда известно, что пакет и ресурсы хранятся в файловой системе, эти имена подкаталогов могут быть используемый непосредственно.
Абстрактный метод возвращает итерабль без элементов.
-
abstractmethod
-
class
importlib.abc.
ResourceLoader
¶ Абстрактный базовый класс для загрузчик, реализующего дополнительный протокол PEP 302 для загрузки произвольных ресурсов из внутреннего сервера хранения.
Не рекомендуется, начиная с версии 3.7: Эта ABC устарела в пользу поддержки загрузки ресурсов через
importlib.abc.ResourceReader
.-
abstractmethod
get_data
(path)¶ Абстрактный метод для возвращает байтов для данных, расположенных в точке path. Загрузчики, которые имеют файлообразный бэкэнд хранения, позволяющий хранить произвольные данные, могут реализовать этот абстрактный метод для предоставления прямого доступа к хранящимся данным.
OSError
должен быть поднят, если path не может быть найден. Предполагается, что path будет создан с использованием модуля__file__
атрибут или элемента из пакета__path__
.Изменено в версии 3.4: Поднимает
OSError
вместоNotImplementedError
.
-
abstractmethod
-
class
importlib.abc.
InspectLoader
¶ Абстрактный базовый класс для загрузчика, реализующего дополнительный протокол PEP 302 для загрузчиков, проверяющих модули.
-
get_code
(fullname)¶ Возвращает объект код для модуля или
None
, если модуль не имеет объекта код (как, например, для встроенного модуля). ПоднимитеImportError
, если погрузчик не может найти запрошенный модуль.Примечание
Хотя метод имеет реализацию по умолчанию, его рекомендуется переопределить, если это возможно для производительности.
Изменено в версии 3.4: Более не абстрактно и конкретное осуществление.
-
abstractmethod
get_source
(fullname)¶ Абстрактный метод для возвращения источника модуля. Это - возвращается как текстовая строка, используя универсальный символ новой строки, переводя все признанные сепараторы линии на знаки
'\n'
. Возвращает значениеNone
, если источник недоступен (например, встроенный модуль). ВызываетImportError
, если загрузчик не может найти указанный модуль.Изменено в версии 3.4: Поднимает
ImportError
вместоNotImplementedError
.
-
is_package
(fullname)¶ Абстрактный метод для возвращает 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
.
-
abstractmethod
-
class
importlib.abc.
FileLoader
(fullname, path)¶ Абстрактный базовый класс, наследующий от
ResourceLoader
иExecutionLoader
, обеспечивающий конкретные реализацииResourceLoader.get_data()
иExecutionLoader.get_filename()
.Аргумент fullname является полностью разрешенным именем модуля, который должен обработать загрузчик. Аргумент path - это путь к файлу для модуля.
Добавлено в версии 3.3.
-
name
¶ Имя модуля, с которым может работать загрузчик.
-
path
¶ Путь к файлу модуля.
-
load_module
(fullname)¶ Вызов
load_module()
super.Не рекомендуется, начиная с версии 3.4: Используйте
Loader.exec_module()
вместо этого.
-
abstractmethod
get_data
(path)¶ Считывает path как двоичный файл и возвращает байты из него.
-
-
class
importlib.abc.
SourceLoader
¶ Абстрактный базовый класс для реализации загрузки исходного (и необязательно байт-кода) файла. Класс наследует как от
ResourceLoader
, так и отExecutionLoader
, требуя реализации:ResourceLoader.get_data()
ExecutionLoader.get_filename()
- Следует возвращает только путь к исходному файлу; загрузка без источника не поддерживается.
Абстрактные методы, определенные этим классом, должны добавить дополнительную поддержку файлов байт-кодов. Осуществление этих дополнительных методов (или порождение их поднять
NotImplementedError
) заставляют погрузчик только работать с источником код. Осуществление методов позволяет погрузчику работать с исходными файлами and байткод; он не допускает sourceless загрузки, где предусмотрен только байт-код. Файлы Bytecode - оптимизация, чтобы ускорить погрузку, удаляя шаг парсинг компилятора Python’s, и таким образом, никакой байткод-определенный 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)¶ Открыть для двоичного чтения resource в пределах package.
package является либо именем, либо объектом модуля, соответствующим требованиям
Package
. resource - название ресурса, который следует открыть в пределах package; он может не содержать разделителей путей и не иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращаетtyping.BinaryIO
сущность, двоичный I/O поток, открытый для чтения.
-
importlib.resources.
open_text
(package, resource, encoding='utf-8', errors='strict')¶ Открыть для чтения текста resource в пределах package. По умолчанию ресурс открыт для чтения как UTF-8.
package является либо именем, либо объектом модуля, соответствующим требованиям
Package
. resource - название ресурса, который следует открыть в пределах package; он может не содержать разделителей путей и не иметь подресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и для встроенныхopen()
.Эта функция возвращает
typing.TextIO
сущность, текст поток I/O, открытый для чтения.
-
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
. Помните, что каталоги - это not ресурсы! 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
. Этот класс реализуетimportlib.abc.MetaPathFinder
иimportlib.abc.InspectLoader
ABCs.Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.
Изменено в версии 3.5: В рамках PEP 489 строящийся импортер сейчас реализует
Loader.create_module()
иLoader.exec_module()
-
class
importlib.machinery.
FrozenImporter
¶ Импортер для замороженных модулей. Этот класс реализует
importlib.abc.MetaPathFinder
иimportlib.abc.InspectLoader
ABCs.Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.
Изменено в версии 3.4: Приобретенные методы
create_module()
иexec_module()
.
-
class
importlib.machinery.
WindowsRegistryFinder
¶ Поисковик для модулей, объявленных в реестре Windows. Этот класс реализует
importlib.abc.MetaPathFinder
ABC.Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.
Добавлено в версии 3.3.
Не рекомендуется, начиная с версии 3.6: Вместо этого используйте конфигурацию
site
. Будущие версии Python могут не включать этот поиск по умолчанию.
-
class
importlib.machinery.
PathFinder
¶ Поисковик для
sys.path
и пакет__path__
атрибуты. Этот класс реализуетimportlib.abc.MetaPathFinder
ABC.Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.
-
classmethod
find_spec
(fullname, path=None, target=None)¶ Метод класса, который пытается найти спецификацию для модуля определенным fullname на
sys.path
или, если определено, на path. Для каждой записи пути, которая является найденный, устанавливается флажокsys.path_importer_cache
. Если неложный объект найден тогда, это - используемый как поисковик пути, чтобы искать модуль, являющийся найденный для. Если никакой вход не найден вsys.path_importer_cache
, тоsys.path_hooks
- найденный для искателя для входа пути и, если найдено, сохранен вsys.path_importer_cache
наряду с тем, чтобы быть подвергнутым сомнению о модуле. Если поиск никогда не найден, тоNone
хранится в кэш и возвращенный.Добавлено в версии 3.4.
Изменено в версии 3.5: Если текущий рабочий каталог, представленный пустым строка, больше недействителен, то
None
является возвращенный, но ни один значение не кэшируется вsys.path_importer_cache
.
-
classmethod
find_module
(fullname, path=None)¶ Устаревшая обертка вокруг
find_spec()
.Не рекомендуется, начиная с версии 3.4: Используйте
find_spec()
вместо этого.
-
classmethod
invalidate_caches
()¶ Вызывает
importlib.abc.PathEntryFinder.invalidate_caches()
для всех поисковиков, хранящихся вsys.path_importer_cache
, которые определяют метод. Иначе записи в набореsys.path_importer_cache
кNone
удалены.Изменено в версии 3.7: Записи
None
вsys.path_importer_cache
удаляются.
Изменено в версии 3.4: Вызов объектов в
sys.path_hooks
с текущим рабочим каталогом для''
(т.е. пустым строка).-
classmethod
-
class
importlib.machinery.
FileFinder
(path, *loader_details)¶ Конкретная реализация
importlib.abc.PathEntryFinder
, которые кэшируют результаты файловой системы.Аргумент path - это каталог, для которого поисковик отвечает за поиск.
Аргумент loader_details представляет собой переменное число кортежей из 2 элементов, каждый из которых содержит загрузчик и последовательность суффиксов файлов, распознаваемых загрузчиком. Ожидается, что загрузчики будут вызываемыми, которые примут два аргумента имени модуля и пути к найденному файлу.
Искатель будет кэш директивное содержание по мере необходимости, делая призывы статистики к каждому поиску модуля, чтобы проверить, что кэш не устарел. Поскольку кэш staleness зависит от детализации состояние информации операционной системы о файловой системе, существует потенциальное условие гонки поиска модуля, создания нового файла, а затем поиска модуля, который представляет новый файл. Если операции выполняются достаточно быстро, чтобы соответствовать гранулярности статических вызовов, поиск модуля завершится неудачей. Чтобы не допустить этого, при динамическом создании модуля обязательно вызовите функцию
importlib.invalidate_caches()
.Добавлено в версии 3.3.
-
path
¶ Путь, по которому будет выполняться поиск.
-
find_spec
(fullname, target=None)¶ Попытайтесь найти, что spec обращается с fullname в
path
.Добавлено в версии 3.4.
-
invalidate_caches
()¶ Очистить внутренний кэш.
-
classmethod
path_hook
(*loader_details)¶ Метод класса, который возвращает закрытие для использования на
sys.path_hooks
. ЭкземплярFileFinder
возвращается замыканием с использованием аргумента пути, переданного замыканию напрямую, и loader_details косвенно.Если аргумент закрытию не существующий справочник,
ImportError
поднят.
-
-
class
importlib.machinery.
SourceFileLoader
(fullname, path)¶ Конкретное осуществление
importlib.abc.SourceLoader
путем подклассированияimportlib.abc.FileLoader
и обеспечения некоторых конкретных реализаций других методов.Добавлено в версии 3.3.
-
name
¶ Имя модуля, который будет обрабатываться этим загрузчиком.
-
path
¶ Путь к исходному файлу.
-
path_stats
(path)¶ Конкретное осуществление
importlib.abc.SourceLoader.path_stats()
.
-
set_data
(path, data)¶ Конкретное осуществление
importlib.abc.SourceLoader.set_data()
.
-
load_module
(name=None)¶ Конкретная реализация
importlib.abc.Loader.load_module()
, где указание имени загружаемого модуля является необязательным.Не рекомендуется, начиная с версии 3.6: Используйте
importlib.abc.Loader.exec_module()
вместо этого.
-
-
class
importlib.machinery.
SourcelessFileLoader
(fullname, path)¶ Конкретное внедрение
importlib.abc.FileLoader
, который может импортировать байткод файлы (т.е. никакой источник файлы код существуют).Обратите внимание на то, что прямое использование байткод файлов (и таким образом не источник файлы код) запрещает вашим модулям то, чтобы быть применимым всеми внедрениями Python или новыми версиями Python, которые изменяют формат байткод.
Добавлено в версии 3.3.
-
name
¶ Имя модуля, обрабатываемого загрузчиком.
-
path
¶ Путь к файлу байт-кода.
-
get_source
(fullname)¶ Возвращает
None
, так как файлы байт-кода не имеют источника, когда загрузчик является используемый.
-
load_module
(name=None)¶
Конкретная реализация
importlib.abc.Loader.load_module()
, где указание имени загружаемого модуля является необязательным.Не рекомендуется, начиная с версии 3.6: Используйте
importlib.abc.Loader.exec_module()
вместо этого.-
-
class
importlib.machinery.
ExtensionFileLoader
(fullname, path)¶ Практическая реализация для расширения
importlib.abc.ExecutionLoader
.Аргумент fullname указывает имя модуля, который должен поддерживать загрузчик. Аргумент path - это путь к файлу модуля расширения.
Добавлено в версии 3.3.
-
name
¶ Имя модуля, поддерживаемого загрузчиком.
-
path
¶ Путь к модулю расширения.
-
create_module
(spec)¶ Создает объект модуля из данной спецификации в соответствии с PEP 489.
Добавлено в версии 3.5.
-
exec_module
(module)¶ Инициализирует данный объект модуля в соответствии с PEP 489.
Добавлено в версии 3.5.
-
is_package
(fullname)¶ Возвращает значение
True
, если путь к файлу указывает на модуль__init__
пакета на основеEXTENSION_SUFFIXES
.
-
get_code
(fullname)¶ Возвращает
None
, так как в модулях расширений отсутствует объект код.
-
get_source
(fullname)¶ Возвращает
None
, так как модули расширения не имеют источника код.
-
-
class
importlib.machinery.
ModuleSpec
(name, loader, *, origin=None, loader_state=None, is_package=None)¶ Спецификация для состояние, связанных с системой импорта модуля. Это, как правило, выставляется как
__spec__
атрибут модуля. В описаниях ниже, имена в круглых скобках дают передачу, атрибут доступный непосредственно на объекте модуля. Например,module.__spec__.origin == module.__file__
. Однако обратите внимание, что, хотя values обычно эквивалентны, они могут различаться, поскольку синхронизация между двумя объектами отсутствует. Таким образом, можно обновлять__path__
модуля во время выполнения, и это не будет автоматически отражаться в__spec__.submodule_search_locations
.Добавлено в версии 3.4.
-
name
¶
(
__name__
)строка для полного имени модуля.
-
loader
¶
(
__loader__
)Загрузчик, который следует использовать при загрузке модуля. Поисковики должены всегда их устанавливать.
-
origin
¶
(
__file__
)Имя места загрузки модуля, например, «builtin» для встроенных модулей и имя файла для модулей, загруженных из источника. Обычно «origin» должно быть установлено, но может быть
None
(по умолчанию), указывающее, что оно не определено (например, для пакетов пространства имен).-
submodule_search_locations
¶
(
__path__
)Список строки для того, где найти подмодули, если пакет (
None
иначе).-
loader_state
¶
Контейнер дополнительных данных по модулю для использования во время загрузки (или
None
).-
cached
¶
(
__cached__
)Строка для хранения скомпилированного модуля (или
None
).-
parent
¶
(
__package__
)(Только для чтения) Полное имя пакета, под которым модуль должен быть загружен как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов он такой же, как
__name__
.-
has_location
¶
Булево указание, относится ли «происхождение» модуля атрибут к загружаемому местоположению.
-
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
с optimization2
приведет к пути байт-кода/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc
. Представление строка optimization может только быть алфавитно-цифровым, ещеValueError
поднят.Параметр debug_override устарел и может быть используемый для переопределения значение системы для
__debug__
.True
значение - это эквивалент установки optimization в пустое строка. ПараметрFalse
значение совпадает с параметром optimization1
. Если оба debug_override a optimization неNone
, тоTypeError
поднимается.Добавлено в версии 3.4.
Изменено в версии 3.5: Параметр optimization добавлен, а параметр debug_override устарел.
Изменено в версии 3.6: Принимает путеподобный объект.
-
importlib.util.
source_from_cache
(path)¶ Учитывая path к имени файла PEP 3147, возвращает связанный источник путь к файлу код. Например, если path является
/foo/bar/__pycache__/baz.cpython-32.pyc
, путь возвращенный будет/foo/bar/baz.py
. path не обязательно существовать, однако если он не соответствует формату PEP 3147 или PEP 488, возникаетValueError
. Если значениеsys.implementation.cache_tag
не определено, значениеNotImplementedError
поднимается.Добавлено в версии 3.4.
Изменено в версии 3.6: Принимает путеподобный объект.
-
importlib.util.
decode_source
(source_bytes)¶ Декодируйте заданные байты, представляющие источник код, и возвращает его как строка с универсальными новыми линиями (в соответствии с требованиями
importlib.abc.InspectLoader.get_source()
).Добавлено в версии 3.4.
-
importlib.util.
resolve_name
(name, package)¶ Разрешает относительное имя модуля на абсолютное.
Если в name нет начальных точек, то просто возвращается name. Это позволяет использовать, например,
importlib.util.resolve_name('sys', __spec__.parent)
, не проверяя, нужен ли аргумент package.ValueError
поднят, если name является относительным именем модуля, но пакет - ложный значение (например,None
или пустой строка).ValueError
также поднимается относительное имя будет выходить из содержащего его пакета (например, запрос..bacon
из пакетаspam
).Добавлено в версии 3.3.
-
importlib.util.
find_spec
(name, package=None)¶ Найти спецификацию для модуля, возможно, относительно указанного имени package. Если модуль находится в
sys.modules
, тоsys.modules[name].__spec__
- возвращенный (если spec не был быNone
или не установлен, в этом случаеValueError
поднят). Иначе поиск, используяsys.meta_path
сделан.None
является возвращенный, если spec не найден.Если name предназначен для подмодуля (содержит точку), родительский модуль автоматически импортируется.
name and 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()
, для заполнения недостающей информации о spec.Добавлено в версии 3.4.
-
importlib.util.
spec_from_file_location
(name, location, *, loader=None, submodule_search_locations=None)¶ Фабричная функция для создания
ModuleSpec
сущность на основе пути к файлу. Недостающая информация будет заполнена на spec путем использования загрузчика API и подразумевая, что модуль будет основан на файле.Добавлено в версии 3.4.
Изменено в версии 3.6: Принимает путеподобный объект.
-
importlib.util.
source_hash
(source_bytes)¶ Возвращает хэш source_bytes в байтах. Файл
.pyc
на основе хэша встраиваетsource_hash()
содержимого соответствующего исходного файла в заголовок.Добавлено в версии 3.7.
-
class
importlib.util.
LazyLoader
(loader)¶ Классу, который откладывает выполнение погрузчика модуля до модуля, получили доступ к атрибут.
Этот класс только работает с загрузчиками, которые определяют
exec_module()
как контроль того, какой тип модуля является используемый для модуля. По тем тем же причинам метод погрузчикаcreate_module()
должен возвращаетNone
или тип, для которого его__class__
атрибут может быть видоизменен наряду с не использованием slots. Наконец, модули, которые заменяют объект, помещенный вsys.modules
, не будут работать, так как нет возможности правильно заменить ссылки модуля в течение всего интерпретатор;ValueError
возникает при обнаружении такой замены.Примечание
Для проектов с критическим временем запуска этот класс позволяет минимизировать затраты на загрузку модуля, если он никогда не будет используемый. Для проектов, где время запуска не важно тогда, использование этого класса - сильно, препятствовал из-за сообщений об ошибках, созданных во время погрузки быть отложенным и таким образом произойти из контекст.
Добавлено в версии 3.5.
Изменено в версии 3.6: Начал вызов
create_module()
, удалив предупреждение о совместимости дляimportlib.machinery.BuiltinImporter
иimportlib.machinery.ExtensionFileLoader
.-
classmethod
factory
(loader)¶ Статический метод, который возвращает вызываемый объект, который создает ленивый загрузчик. это предназначен для использования в ситуациях, когда загрузчик передается классом вместо экземпляра..:
suffixes = importlib.machinery.SOURCE_SUFFIXES loader = importlib.machinery.SourceFileLoader lazy_loader = importlib.util.LazyLoader.factory(loader) finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))
-
classmethod
Примеры¶
Программный импорт¶
Для программного импорта модуля
используйте команду importlib.import_module()
:
import importlib
itertools = importlib.import_module('itertools')
Проверка возможности импорта модуля¶
Если необходимо выяснить, может ли модуль быть импортирован без выполнения
импорта, следует использовать importlib.util.find_spec()
:
import importlib.util
import sys
# Для наглядности.
name = 'itertools'
if name in sys.modules:
print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
# Если вы решили выполнить фактический импорт ...
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)
print(f"{name!r} has been imported")
else:
print(f"can't find the {name!r} module")
Импорт исходного файла непосредственно¶
Чтобы импортировать исходный файл Python непосредственно, используйте следующий рецепт (Python 3.5 и более новый только):
import importlib.util
import sys
# Для наглядности.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)
Настройка импортера¶
Для глубокой настройки импорта обычно требуется реализовать импортер. Это
означает управление как поисковик, так и загрузчик стороной вещей. Для
поисковиков есть два вкуса на выбор в зависимости от ваших потребностей:
поисковик мета-пути или поисковик пути.
Первый - то, что вы поставили бы sys.meta_path
, в то
время как последний - то, что вы создаете использование
хук пути входа на
sys.path_hooks
, который работает с записями sys.path
, чтобы потенциально создать
искателя. В этом примере показано, как зарегистрировать собственных импортеров,
чтобы импорт использовал их (для создания импортера для себя прочитайте
документацию по соответствующим классам, определенным в этом пакете):
import importlib.machinery
import sys
# Для наглядности.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
importlib.machinery.SOURCE_SUFFIXES)
# Настройка мета пути поиска.
# Обязательно поместите поисковик в нужное место в списке с точки
# зрения приоритета.
sys.meta_path.append(SpamMetaPathFinder)
# Настройка средства поиска записей пути. Убедитесь, что хук пути расположен в
# списке в соответствии с приоритетом.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
Приближение importlib.import_module()
¶
Сам импорт реализуется в Python код, что позволяет выставить
большую часть импортной техники через importlib. Следующее помогает
проиллюстрировать различные API, которые importlib раскрывает, предоставляя
приблизительную реализацию importlib.import_module()
(Python 3.4 и более новые для
использования importlib, Python 3.6 и более новые для других частей
код)
import importlib.util
import sys
def import_module(name, package=None):
"""Примерная реализация импорта."""
absolute_name = importlib.util.resolve_name(name, package)
try:
return sys.modules[absolute_name]
except KeyError:
pass
path = None
if '.' in absolute_name:
parent_name, _, child_name = absolute_name.rpartition('.')
parent_module = import_module(parent_name)
path = parent_module.__spec__.submodule_search_locations
for finder in sys.meta_path:
spec = finder.find_spec(absolute_name, path)
if spec is not None:
break
else:
msg = f'No module named {absolute_name!r}'
raise ModuleNotFoundError(msg, name=absolute_name)
module = importlib.util.module_from_spec(spec)
sys.modules[absolute_name] = module
spec.loader.exec_module(module)
if path is not None:
setattr(parent_module, child_name, module)
return module