importlib
— Реализация import
¶
Добавлено в версии 3.1.
Исходный код: Lib/importlib/__init__.py.
Введение¶
Цель пакета importlib
двояка. Первая - предоставить реализацию оператора import
(и, следовательно, функцию __import__()
) в исходном коде Python. Это обеспечивает реализацию import
, которая переносима в любой интерпретатор Python. Это также обеспечивает реализацию, которую легче понять, чем ту, которая реализована на языке программирования, отличном от Python.
Во-вторых, компоненты для реализации import
раскрыты в этом пакете, что облегчает пользователям создание собственных пользовательских объектов (известных как importer) для участия в процессе импорта.
См.также
- Оператор 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)¶ Найти загрузчик для модуля, по желанию в указанном пути. Если модуль находится в
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 перекомпилируется и код на уровне модуля выполняется заново, определяя новый набор объектов, которые привязываются к именам в словаре модуля путем повторного использования функции loader, которая первоначально загрузила модуль. Функция
init
модулей расширения не вызывается второй раз.Как и все другие объекты в Python, старые объекты восстанавливаются только после того, как количество ссылок на них упадет до нуля.
Имена в пространстве имен модуля обновляются, чтобы указать на все новые или измененные объекты.
Другие ссылки на старые объекты (например, имена, внешние по отношению к модулю) не могут ссылаться на новые объекты и должны быть обновлены в каждом пространстве имен, где они встречаются, если это необходимо.
Есть и ряд других предостережений:
Когда модуль перезагружается, его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имен отменяют старые определения, так что обычно это не является проблемой. Если в новой версии модуля не определено имя, которое было определено в старой версии, то старое определение сохраняется. Эта возможность может быть использована в интересах модуля, если он поддерживает глобальную таблицу или кэш объектов — с помощью оператора
try
можно проверить наличие таблицы и пропустить ее инициализацию при желании:try: cache except NameError: cache = {}
Обычно не очень полезно перезагружать встроенные или динамически загружаемые модули. Перезагрузка
sys
,__main__
,builtins
и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не предназначены для инициализации более одного раза, и при перезагрузке могут дать произвольный сбой.Если модуль импортирует объекты из другого модуля с помощью
from
…import
…, вызовreload()
для другого модуля не переопределяет импортированные из него объекты — одним из способов обойти это является повторное выполнение оператораfrom
, другим - использованиеimport
и квалифицированных имен (module.name) вместо этого.Если модуль инстанцирует экземпляры класса, перезагрузка модуля, определяющего класс, не влияет на определения методов этих экземпляров - они продолжают использовать старое определение класса. То же самое справедливо и для производных классов.
Добавлено в версии 3.4.
Изменено в версии 3.7:
ModuleNotFoundError
возникает, если в перезагружаемом модуле отсутствуетModuleSpec
.
importlib.abc
– Абстрактные базовые классы, связанные с импортом¶
Исходный код: Lib/importlib/abc.py.
Модуль importlib.abc
содержит все основные абстрактные базовые классы, используемые import
. Некоторые подклассы основных абстрактных базовых классов также предоставляются для помощи в реализации основных ABC.
Иерархия ABC:
object
+-- Finder (deprecated)
+-- MetaPathFinder
+-- PathEntryFinder
+-- Loader
+-- ResourceLoader --------+
+-- InspectLoader |
+-- ExecutionLoader --+
+-- FileLoader
+-- SourceLoader
-
class
importlib.abc.
Finder
¶ Абстрактный базовый класс, представляющий finder.
Не рекомендуется, начиная с версии 3.3: Вместо этого используйте
MetaPathFinder
илиPathEntryFinder
.-
abstractmethod
find_module
(fullname, path=None)¶ Абстрактный метод для поиска loader для указанного модуля. Первоначально указанный в PEP 302, этот метод был предназначен для использования в
sys.meta_path
и в подсистеме импорта на основе пути.Изменено в версии 3.4: Возвращает
None
при вызове вместо повышенияNotImplementedError
.Не рекомендуется, начиная с версии 3.10: Вместо этого используйте
MetaPathFinder.find_spec()
илиPathEntryFinder.find_spec()
.
-
abstractmethod
-
class
importlib.abc.
MetaPathFinder
¶ Абстрактный базовый класс, представляющий meta path finder.
Добавлено в версии 3.3.
Изменено в версии 3.10: Больше не является подклассом
Finder
.-
find_spec
(fullname, path, target=None)¶ Абстрактный метод для поиска spec для указанного модуля. Если это импорт верхнего уровня, path будет
None
. В противном случае, это поиск подпакета или модуля, и path будет значением__path__
из родительского пакета. Если спецификация не может быть найдена, возвращаетсяNone
. При передачеtarget
является объектом модуля, который может быть использован искателем для более точного предположения о том, какую спецификацию вернуть.importlib.util.spec_from_loader()
может быть полезен для реализации конкретныхMetaPathFinders
.Добавлено в версии 3.4.
-
find_module
(fullname, path)¶ Унаследованный метод для поиска loader для указанного модуля. Если это импорт верхнего уровня, 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
¶ Абстрактный базовый класс, представляющий path entry finder. Хотя он имеет некоторое сходство с
MetaPathFinder
,PathEntryFinder
предназначен для использования только в подсистеме импорта на основе путей, предоставляемойimportlib.machinery.PathFinder
.Добавлено в версии 3.3.
Изменено в версии 3.10: Больше не является подклассом
Finder
.-
find_spec
(fullname, target=None)¶ Абстрактный метод для поиска spec для указанного модуля. Поисковик будет искать модуль только в пределах path entry, которому он присвоен. Если модуль не может быть найден, возвращается
None
. При передачеtarget
является объектом модуля, который искатель может использовать для более точного предположения о том, какую спецификацию вернуть.importlib.util.spec_from_loader()
может быть полезен для реализации конкретныхPathEntryFinders
.Добавлено в версии 3.4.
-
find_loader
(fullname)¶ Унаследованный метод для поиска loader для указанного модуля. Возвращает кортеж из
(loader, portion)
, гдеportion
- последовательность расположений файловой системы, вносящих вклад в часть пакета пространства имен. Загрузчик может бытьNone
при указанииportion
для обозначения вклада расположений файловой системы в пакет пространства имен. Пустой список может быть использован дляportion
, чтобы указать, что загрузчик не является частью пакета пространства имен. Еслиloader
являетсяNone
иportion
является пустым списком, то загрузчик или расположение для пакета пространства имен не найдены (т.е. для модуля ничего не найдено).Если определено
find_spec()
, то обеспечивается обратная совместимость.Изменено в версии 3.4: Возвращает
(None, [])
вместо того, чтобы подниматьNotImplementedError
. Используетfind_spec()
, когда это доступно для обеспечения функциональности.Не рекомендуется, начиная с версии 3.4: Вместо этого используйте
find_spec()
.
-
find_module
(fullname)¶ Конкретная реализация
Finder.find_module()
, которая эквивалентнаself.find_loader(fullname)[0]
.Не рекомендуется, начиная с версии 3.4: Вместо этого используйте
find_spec()
.
-
invalidate_caches
()¶ Необязательный метод, который при вызове должен аннулировать любой внутренний кэш, используемый искателем. Используется
importlib.machinery.PathFinder.invalidate_caches()
при аннулировании кэшей всех кэшированных искателей.
-
-
class
importlib.abc.
Loader
¶ Абстрактный базовый класс для loader. Точное определение загрузчика см. в PEP 302.
Загрузчики, которые хотят поддерживать чтение ресурсов, должны реализовать метод
get_resource_reader(fullname)
, как указано вimportlib.abc.ResourceReader
.Изменено в версии 3.7: Введен необязательный метод
get_resource_reader()
.-
create_module
(spec)¶ Метод, возвращающий объект модуля для использования при импорте модуля. Этот метод может возвращать
None
, указывая на то, что должна иметь место семантика создания модуля по умолчанию.Добавлено в версии 3.4.
Изменено в версии 3.5: Начиная с Python 3.6, этот метод не будет необязательным, если определено
exec_module()
.
-
exec_module
(module)¶ Абстрактный метод, который выполняет модуль в его собственном пространстве имен, когда модуль импортируется или перезагружается. Модуль уже должен быть инициализирован, когда вызывается
exec_module()
. Когда этот метод существует,create_module()
должен быть определен.Добавлено в версии 3.4.
Изменено в версии 3.6:
create_module()
также должен быть определен.
-
load_module
(fullname)¶ Унаследованный метод для загрузки модуля. Если модуль не может быть загружен, выдается сообщение
ImportError
, в противном случае возвращается загруженный модуль.Если запрашиваемый модуль уже существует в
sys.modules
, этот модуль должен быть использован и перезагружен. В противном случае загрузчик должен создать новый модуль и вставить его вsys.modules
до начала загрузки, чтобы предотвратить рекурсию от импорта. Если загрузчик вставил модуль и загрузка не удалась, он должен быть удален загрузчиком изsys.modules
; модули, уже находившиеся вsys.modules
до начала выполнения загрузчиком, должны быть оставлены в покое (см.importlib.util.module_for_loader()
).Загрузчик должен установить несколько атрибутов модуля. (Обратите внимание, что некоторые из этих атрибутов могут меняться при перезагрузке модуля):
__name__
Имя модуля.
__file__
Путь к месту хранения данных модуля (не задается для встроенных модулей).
__cached__
Путь к месту, где хранится/должна храниться скомпилированная версия модуля (не задается, если атрибут был бы неуместен).
__path__
Список строк, указывающих путь поиска внутри пакета. Этот атрибут не устанавливается для модулей.
__package__
Полное имя пакета, под которым модуль был загружен как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов это то же самое, что и
__name__
. Декораторimportlib.util.module_for_loader()
может обработать детали для__package__
.
__loader__
Загрузчик, используемый для загрузки модуля. Декоратор
importlib.util.module_for_loader()
может обрабатывать детали для__package__
.
Если доступно
exec_module()
, то обеспечивается обратно совместимая функциональность.Изменено в версии 3.4: Поднимайте
ImportError
при вызове вместоNotImplementedError
. Функциональность, предоставляемая при наличииexec_module()
.Не рекомендуется, начиная с версии 3.4: Рекомендуемый API для загрузки модуля -
exec_module()
(иcreate_module()
). Загрузчики должны реализовывать его вместо load_module(). Механизм импорта берет на себя все остальные обязанности load_module(), когда реализуется exec_module().
-
module_repr
(module)¶ Унаследованный метод, который при реализации вычисляет и возвращает repr данного модуля в виде строки. Метод repr() по умолчанию типа модуля будет использовать результат этого метода по мере необходимости.
Добавлено в версии 3.3.
Изменено в версии 3.4: Сделан опциональным вместо абстрактного метода.
Не рекомендуется, начиная с версии 3.4: Теперь механизм импорта заботится об этом автоматически.
-
-
class
importlib.abc.
ResourceReader
¶ Заменен на TraversableResources.
abstract base class для обеспечения возможности чтения ресурсов.
С точки зрения данного букваря, ресурс - это двоичный артефакт, который поставляется в составе пакета. Обычно это что-то вроде файла данных, который живет рядом с файлом
__init__.py
пакета. Цель этого класса - помочь абстрагироваться от доступа к таким файлам данных, чтобы не имело значения, хранится ли пакет и его файл(ы) данных в файле, например, zip, или в файловой системе.Для любого из методов этого класса аргумент resource должен быть path-like object, который концептуально представляет собой просто имя файла. Это означает, что в аргумент resource не следует включать пути к подкаталогам. Это происходит потому, что в качестве «каталога» выступает местоположение пакета, для которого предназначен считыватель. Отсюда метафора для каталогов и имен файлов - пакеты и ресурсы, соответственно. Именно поэтому ожидается, что экземпляры этого класса будут напрямую соотноситься с конкретным пакетом (вместо того, чтобы потенциально представлять несколько пакетов или модуль).
Загрузчики, которые хотят поддерживать чтение ресурсов, должны предоставлять метод
get_resource_reader(fullname)
, который возвращает объект, реализующий интерфейс этого ABC. Если модуль, указанный в fullname, не является пакетом, этот метод должен возвращатьNone
. Объект, совместимый с данным ABC, должен возвращаться только в том случае, если указанный модуль является пакетом.Добавлено в версии 3.7.
-
abstractmethod
open_resource
(resource)¶ Возвращает открытый, file-like object для двоичного чтения ресурс.
Если ресурс не может быть найден, выдается сообщение
FileNotFoundError
.
-
abstractmethod
resource_path
(resource)¶ Возвращает путь файловой системы к ресурсу.
Если ресурс конкретно не существует в файловой системе, поднимите
FileNotFoundError
.
-
abstractmethod
is_resource
(name)¶ Возвращает
True
, если имя name считается ресурсом. ВозвращаетсяFileNotFoundError
, если name не существует.
-
abstractmethod
contents
()¶ Возвращает iterable строк по содержимому пакета. Обратите внимание, что не обязательно, чтобы все имена, возвращаемые итератором, были реальными ресурсами, например, допустимо возвращать имена, для которых
is_resource()
будет false.Разрешение возвращать имена, не относящиеся к ресурсам, предназначено для ситуаций, когда способ хранения пакета и его ресурсов известен априори, и имена, не относящиеся к ресурсам, могут быть полезны. Например, возврат имен подкаталогов разрешен для того, чтобы, когда известно, что пакет и ресурсы хранятся в файловой системе, эти имена подкаталогов можно было использовать напрямую.
Абстрактный метод возвращает итерабельную таблицу без элементов.
-
abstractmethod
-
class
importlib.abc.
ResourceLoader
¶ Абстрактный базовый класс для loader, который реализует дополнительный протокол PEP 302 для загрузки произвольных ресурсов из внутреннего хранилища.
Не рекомендуется, начиная с версии 3.7: Этот ABC устарел в пользу поддержки загрузки ресурсов через
importlib.abc.ResourceReader
.-
abstractmethod
get_data
(path)¶ Абстрактный метод для возврата байтов для данных, расположенных по адресу path. Загрузчики, имеющие файлоподобное хранилище, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод для предоставления прямого доступа к хранимым данным. Если путь не может быть найден, будет выдано сообщение
OSError
. Ожидается, что путь будет построен с использованием атрибута__file__
модуля или элемента из__path__
пакета.Изменено в версии 3.4: Поднимает
OSError
вместоNotImplementedError
.
-
abstractmethod
-
class
importlib.abc.
InspectLoader
¶ Абстрактный базовый класс для loader, который реализует дополнительный протокол PEP 302 для загрузчиков, проверяющих модули.
-
get_code
(fullname)¶ Возвращает объект кода для модуля, или
None
, если модуль не имеет объекта кода (как, например, в случае встроенного модуля). Вызовите сообщениеImportError
, если загрузчик не может найти запрашиваемый модуль.Примечание
Хотя метод имеет реализацию по умолчанию, рекомендуется переопределить его, если это возможно для повышения производительности.
Изменено в версии 3.4: Больше не является абстрактным и имеет конкретную реализацию.
-
abstractmethod
get_source
(fullname)¶ Абстрактный метод для возврата исходного текста модуля. Возвращается в виде текстовой строки с использованием universal newlines, переводя все распознанные разделители строк в символы
'\n'
. ВозвращаетNone
, если источник недоступен (например, встроенный модуль). ВозвращаетImportError
, если загрузчик не может найти указанный модуль.Изменено в версии 3.4: Поднимает
ImportError
вместоNotImplementedError
.
-
is_package
(fullname)¶ Необязательный метод, возвращающий значение true, если модуль является пакетом, и false в противном случае.
ImportError
выдается, если loader не может найти модуль.Изменено в версии 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)¶ Вызывает команду super’s
load_module()
.Не рекомендуется, начиная с версии 3.4: Вместо этого используйте
Loader.exec_module()
.
-
abstractmethod
get_data
(path)¶ Читает path как двоичный файл и возвращает байты из него.
-
-
class
importlib.abc.
SourceLoader
¶ Абстрактный базовый класс для реализации загрузки исходных файлов (и, по желанию, байткода). Класс наследуется от
ResourceLoader
иExecutionLoader
, требуя реализации:ExecutionLoader.get_filename()
Должен возвращать только путь к исходному файлу; загрузка без источников не поддерживается.
Абстрактные методы, определенные этим классом, предназначены для добавления необязательной поддержки файлов байткода. Если не реализовать эти необязательные методы (или заставить их вызывать ошибку
NotImplementedError
), загрузчик будет работать только с исходным кодом. Реализация этих методов позволяет загрузчику работать с файлами исходного и байткода; она не позволяет выполнять загрузку без источника, когда предоставляется только байткод. Файлы байткода - это оптимизация для ускорения загрузки путем удаления этапа разбора компилятора Python, поэтому API, специфичный для байткода, не используется.-
path_stats
(path)¶ Необязательный абстрактный метод, который возвращает
dict
, содержащий метаданные об указанном пути. Поддерживаются следующие ключи словаря:'mtime'
(обязательно): целое число или число с плавающей точкой, представляющее время модификации исходного кода;'size'
(необязательно): размер в байтах исходного кода.
Любые другие ключи в словаре игнорируются, чтобы обеспечить возможность будущих расширений. Если путь не может быть обработан, выдается сообщение
OSError
.Добавлено в версии 3.3.
Изменено в версии 3.4: Поднимите
OSError
вместоNotImplementedError
.
-
path_mtime
(path)¶ Необязательный абстрактный метод, который возвращает время модификации для указанного пути.
Не рекомендуется, начиная с версии 3.3: Этот метод устарел в пользу
path_stats()
. Вы не обязаны его реализовывать, но он все еще доступен для совместимости. ВызовOSError
, если путь не может быть обработан.Изменено в версии 3.4: Поднимите
OSError
вместоNotImplementedError
.
-
set_data
(path, data)¶ Необязательный абстрактный метод, который записывает указанные байты в путь к файлу. Любые несуществующие промежуточные каталоги будут созданы автоматически.
Если запись в путь не удается, потому что путь доступен только для чтения (
errno.EACCES
/PermissionError
), не распространяйте исключение.Изменено в версии 3.4: Больше не поднимает
NotImplementedError
при колле.
-
get_code
(fullname)¶ Конкретная реализация
InspectLoader.get_code()
.
-
exec_module
(module)¶ Конкретная реализация
Loader.exec_module()
.Добавлено в версии 3.4.
-
load_module
(fullname)¶ Конкретная реализация
Loader.load_module()
.Не рекомендуется, начиная с версии 3.4: Вместо этого используйте
exec_module()
.
-
get_source
(fullname)¶ Конкретная реализация
InspectLoader.get_source()
.
-
is_package
(fullname)¶ Конкретная реализация
InspectLoader.is_package()
. Модуль считается пакетом, если путь к его файлу (как указано вExecutionLoader.get_filename()
) представляет собой файл с именем__init__
, если убрать расширение файла и само имя модуля не заканчивается на__init__
.
-
class
importlib.abc.
Traversable
¶ Объект с подмножеством методов pathlib.Path, подходящих для обхода каталогов и открытия файлов.
Добавлено в версии 3.9.
-
abstractmethod
name
()¶ Базовое имя этого объекта без каких-либо родительских ссылок.
-
abstractmethod
iterdir
()¶ Yield Traversable objects in self.
-
abstractmethod
is_dir
()¶ Возвращает True, если self является каталогом.
-
abstractmethod
is_file
()¶ Возвращает True, если self является файлом.
-
abstractmethod
joinpath
(child)¶ Возврат Обращаемый ребенок в self.
-
abstractmethod
__truediv__
(child)¶ Возврат Обращаемый ребенок в self.
-
abstractmethod
open
(mode='r', *args, **kwargs)¶ mode может быть „r“ или „rb“ для открытия в текстовом или двоичном виде. Возвращает хэндл, пригодный для чтения (аналогично
pathlib.Path.open
).При открытии как текст, принимает параметры кодировки, подобные тем, которые принимает
io.TextIOWrapper
.
-
read_bytes
()¶ Считать содержимое self в виде байтов.
-
read_text
(encoding=None)¶ Прочитайте содержимое себя как текст.
-
abstractmethod
-
class
importlib.abc.
TraversableResources
¶ Абстрактный базовый класс для читателей ресурсов, способных обслуживать интерфейс
files
. Подклассы ResourceReader и обеспечивают конкретные реализации абстрактных методов ResourceReader. Поэтому любой загрузчик, поставляющий TraversableReader, также поставляет ResourceReader.Загрузчики, которые хотят поддерживать чтение ресурсов, должны реализовать этот интерфейс.
Добавлено в версии 3.9.
importlib.resources
– Ресурсы¶
Исходный код: Lib/importlib/resources.py.
Добавлено в версии 3.7.
Этот модуль использует систему импорта Python для предоставления доступа к ресурсам внутри пакетов. Если вы можете импортировать пакет, вы можете получить доступ к ресурсам внутри этого пакета. Ресурсы можно открывать или читать в двоичном или текстовом режиме.
Ресурсы примерно похожи на файлы внутри каталогов, хотя важно помнить, что это всего лишь метафора. Ресурсы и пакеты **не обязательно должны существовать как физические файлы и каталоги в файловой системе.
Примечание
Этот модуль предоставляет функциональность, аналогичную pkg_resources Basic Resource Access без накладных расходов на производительность этого пакета. Это упрощает чтение ресурсов, включенных в пакеты, с более стабильной и последовательной семантикой.
Автономный бэкпорт этого модуля предоставляет больше информации о using importlib.resources и migrating from pkg_resources to importlib.resources.
Загрузчики, которые хотят поддерживать чтение ресурсов, должны реализовать метод get_resource_reader(fullname)
, как указано в importlib.abc.ResourceReader
.
Определены следующие типы.
-
importlib.resources.
Package
¶ Тип
Package
определяется какUnion[str, ModuleType]
. Это означает, что там, где функция описывает приемPackage
, вы можете передать либо строку, либо модуль. Объекты модуля должны иметь разрешимый__spec__.submodule_search_locations
, который не являетсяNone
.
-
importlib.resources.
Resource
¶ Этот тип описывает имена ресурсов, передаваемые в различные функции этого пакета. Он определяется как
Union[str, os.PathLike]
.
Доступны следующие функции.
-
importlib.resources.
files
(package)¶ Возвращает объект
importlib.resources.abc.Traversable
, представляющий контейнер ресурсов для пакета (считай, каталог) и его ресурсы (считай, файлы). Traversable может содержать другие контейнеры (думаю, подкаталоги).package - это либо имя, либо объект модуля, который соответствует требованиям
Package
.Добавлено в версии 3.9.
-
importlib.resources.
as_file
(traversable)¶ Учитывая объект
importlib.resources.abc.Traversable
, представляющий файл, обычно изimportlib.resources.files()
, верните менеджер контекста для использования в оператореwith
. Менеджер контекста предоставляет объектpathlib.Path
.Выход из контекстного менеджера очищает любой временный файл, созданный при извлечении ресурса, например, из zip-файла.
Используйте
as_file
, когда методов Traversable (read_text
и т.д.) недостаточно и требуется фактический файл в файловой системе.Добавлено в версии 3.9.
-
importlib.resources.
open_binary
(package, resource)¶ Открыть для бинарного чтения ресурс внутри пакета.
package - это либо имя, либо объект модуля, который соответствует требованиям
Package
. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь вложенных ресурсов (т.е. не может быть каталогом). Эта функция возвращает экземплярtyping.BinaryIO
, двоичный поток ввода-вывода, открытый для чтения.
-
importlib.resources.
open_text
(package, resource, encoding='utf-8', errors='strict')¶ Открыть для чтения текста ресурс в пакете. По умолчанию ресурс открывается для чтения в формате UTF-8.
package - это либо имя, либо объект модуля, который соответствует требованиям
Package
. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь вложенных ресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и для встроенногоopen()
.Эта функция возвращает экземпляр
typing.TextIO
, текстовый поток ввода/вывода, открытый для чтения.
-
importlib.resources.
read_binary
(package, resource)¶ Прочитать и вернуть содержимое resource внутри package в виде
bytes
.package - это либо имя, либо объект модуля, который соответствует требованиям
Package
. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает содержимое ресурса в видеbytes
.
-
importlib.resources.
read_text
(package, resource, encoding='utf-8', errors='strict')¶ Считывает и возвращает содержимое resource в package в виде
str
. По умолчанию содержимое считывается в строгом формате UTF-8.package - это либо имя, либо объект модуля, который соответствует требованиям
Package
. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь вложенных ресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и для встроенной функцииopen()
. Эта функция возвращает содержимое ресурса в видеstr
.
-
importlib.resources.
path
(package, resource)¶ Возвращает путь к ресурсу в виде фактического пути к файловой системе. Эта функция возвращает менеджер контекста для использования в операторе
with
. Менеджер контекста предоставляет объектpathlib.Path
.Выход из контекстного менеджера очищает любой временный файл, созданный, когда ресурс должен быть извлечен, например, из zip-файла.
package - это либо имя, либо объект модуля, который соответствует требованиям
Package
. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь подресурсов (т.е. не может быть каталогом).
-
importlib.resources.
is_resource
(package, name)¶ Возвращает
True
, если в пакете есть ресурс с именем name, иначеFalse
. Помните, что каталоги - это не ресурсы! package - это либо имя, либо объект модуля, который соответствует требованиямPackage
.
-
importlib.resources.
contents
(package)¶ Возвращает итерабельную выборку по именованным элементам в пакете. Итерабельность возвращает
str
ресурсов (например, файлов) и не-ресурсов (например, каталогов). Итерабельность не пересматривает подкаталоги.package - это либо имя, либо объект модуля, который соответствует требованиям
Package
.
importlib.machinery
– Импортеры и крючки путей¶
Исходный код: Lib/importlib/machinery.py.
Этот модуль содержит различные объекты, которые помогают import
находить и загружать модули.
-
importlib.machinery.
SOURCE_SUFFIXES
¶ Список строк, представляющих распознанные суффиксы файлов для исходных модулей.
Добавлено в версии 3.3.
-
importlib.machinery.
DEBUG_BYTECODE_SUFFIXES
¶ Список строк, представляющих суффиксы файлов для неоптимизированных модулей байткода.
Добавлено в версии 3.3.
Не рекомендуется, начиная с версии 3.5: Вместо этого используйте
BYTECODE_SUFFIXES
.
-
importlib.machinery.
OPTIMIZED_BYTECODE_SUFFIXES
¶ Список строк, представляющих суффиксы файлов для оптимизированных модулей байткода.
Добавлено в версии 3.3.
Не рекомендуется, начиная с версии 3.5: Вместо этого используйте
BYTECODE_SUFFIXES
.
-
importlib.machinery.
BYTECODE_SUFFIXES
¶ Список строк, представляющих распознанные суффиксы файлов для модулей байткода (включая ведущую точку).
Добавлено в версии 3.3.
Изменено в версии 3.5: Значение больше не зависит от
__debug__
.
-
importlib.machinery.
EXTENSION_SUFFIXES
¶ Список строк, представляющих распознанные суффиксы файлов для модулей расширения.
Добавлено в версии 3.3.
-
importlib.machinery.
all_suffixes
()¶ Возвращает объединенный список строк, представляющих все суффиксы файлов для модулей, распознаваемых стандартным механизмом импорта. Это помощник для кода, которому просто нужно знать, ссылается ли путь к файловой системе на модуль, не требуя подробностей о типе модуля (например,
inspect.getmodulename()
).Добавлено в версии 3.3.
-
class
importlib.machinery.
BuiltinImporter
¶ importer для встроенных модулей. Все известные встроенные модули перечислены в
sys.builtin_module_names
. Этот класс реализуетimportlib.abc.MetaPathFinder
иimportlib.abc.InspectLoader
ABC.Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.
Изменено в версии 3.5: Как часть PEP 489, встроенный импортер теперь реализует
Loader.create_module()
иLoader.exec_module()
.
-
class
importlib.machinery.
FrozenImporter
¶ Класс importer для замороженных модулей. Этот класс реализует
importlib.abc.MetaPathFinder
иimportlib.abc.InspectLoader
ABCs.Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.
Изменено в версии 3.4: Получил методы
create_module()
иexec_module()
.
-
class
importlib.machinery.
WindowsRegistryFinder
¶ Finder для модулей, объявленных в реестре Windows. Этот класс реализует
importlib.abc.MetaPathFinder
ABC.Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.
Добавлено в версии 3.3.
Не рекомендуется, начиная с версии 3.6: Вместо этого используйте конфигурацию
site
. Будущие версии Python могут не включать этот поисковик по умолчанию.
-
class
importlib.machinery.
PathFinder
¶ Класс Finder для атрибутов
sys.path
и пакета__path__
. Этот класс реализуетimportlib.abc.MetaPathFinder
ABC.Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.
-
classmethod
find_spec
(fullname, path=None, target=None)¶ Метод класса, который пытается найти spec для модуля, указанного fullname на
sys.path
или, если определено, на path. Для каждого элемента пути, по которому ведется поиск, проверяетсяsys.path_importer_cache
. Если найден не ложный объект, то он используется в качестве path entry finder для поиска искомого модуля. Если запись в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 - это каталог, поиск в котором выполняет программа finder.
Аргумент loader_details представляет собой переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность суффиксов файлов, которые распознает загрузчик. Ожидается, что загрузчики будут вызываемыми файлами, которые принимают два аргумента: имя модуля и путь к найденному файлу.
Программа поиска будет кэшировать содержимое каталога по мере необходимости, выполняя вызовы stat для каждого поиска модуля, чтобы убедиться, что кэш не устарел. Поскольку неизменность кэша зависит от детализации информации операционной системы о состоянии файловой системы, существует потенциальное состояние гонки: поиск модуля, создание нового файла, а затем поиск модуля, который представляет новый файл. Если эти операции выполняются достаточно быстро, чтобы уложиться в гранулярность вызовов stat, то поиск модуля завершится неудачей. Чтобы этого не произошло, при динамическом создании модуля обязательно вызывайте
importlib.invalidate_caches()
.Добавлено в версии 3.3.
-
path
¶ Путь, по которому будет вестись поиск.
-
find_spec
(fullname, target=None)¶ Попытка найти спецификацию для обработки fullname в пределах
path
.Добавлено в версии 3.4.
-
find_loader
(fullname)¶ Попытка найти загрузчик для обработки fullname в пределах
path
.Не рекомендуется, начиная с версии 3.10: Вместо этого используйте
find_spec()
.
-
invalidate_caches
()¶ Очистите внутренний кэш.
-
classmethod
path_hook
(*loader_details)¶ Метод класса, который возвращает закрытие для использования на
sys.path_hooks
. ЭкземплярFileFinder
возвращается закрытием, используя аргумент path, переданный закрытию напрямую, и loader_details косвенно.Если аргумент закрытия не является существующим каталогом, выдается сообщение
ImportError
.
-
-
class
importlib.machinery.
SourceFileLoader
(fullname, path)¶ Конкретная реализация
importlib.abc.SourceLoader
путем подклассификацииimportlib.abc.FileLoader
и предоставления некоторых конкретных реализаций других методов.Добавлено в версии 3.3.
-
name
¶ Имя модуля, который будет обрабатывать этот загрузчик.
-
path
¶ Путь к исходному файлу.
-
path_stats
(path)¶ Конкретная реализация
importlib.abc.SourceLoader.path_stats()
.
-
set_data
(path, data)¶ Конкретная реализация
importlib.abc.SourceLoader.set_data()
.
-
load_module
(name=None)¶ Конкретная реализация
importlib.abc.Loader.load_module()
, где указание имени загружаемого модуля является необязательным.Не рекомендуется, начиная с версии 3.6: Вместо этого используйте
importlib.abc.Loader.exec_module()
.
-
-
class
importlib.machinery.
SourcelessFileLoader
(fullname, path)¶ Конкретная реализация
importlib.abc.FileLoader
, которая может импортировать файлы байткода (т.е. файлы исходного кода отсутствуют).Обратите внимание, что прямое использование файлов байткода (а не файлов исходного кода) препятствует использованию ваших модулей всеми реализациями Python или новыми версиями Python, которые изменяют формат байткода.
Добавлено в версии 3.3.
-
name
¶ Имя модуля, с которым будет работать загрузчик.
-
path
¶ Путь к файлу байткода.
-
get_source
(fullname)¶ Возвращает
None
, так как файлы байткода не имеют источника при использовании этого загрузчика.
-
load_module
(name=None)¶
Конкретная реализация
importlib.abc.Loader.load_module()
, где указание имени загружаемого модуля является необязательным.Не рекомендуется, начиная с версии 3.6: Вместо этого используйте
importlib.abc.Loader.exec_module()
.-
-
class
importlib.machinery.
ExtensionFileLoader
(fullname, path)¶ Конкретная реализация
importlib.abc.ExecutionLoader
для модулей расширения.Аргумент fullname указывает имя модуля, который должен поддерживать загрузчик. Аргумент path - это путь к файлу модуля расширения.
Добавлено в версии 3.3.
-
name
¶ Имя модуля, который поддерживает загрузчик.
-
path
¶ Путь к модулю расширения.
-
create_module
(spec)¶ Создает объект модуля из заданной спецификации в соответствии с PEP 489.
Добавлено в версии 3.5.
-
exec_module
(module)¶ Инициализирует заданный объект модуля в соответствии с PEP 489.
Добавлено в версии 3.5.
-
is_package
(fullname)¶ Возвращает
True
, если путь к файлу указывает на модуль пакета__init__
, основанный наEXTENSION_SUFFIXES
.
-
get_code
(fullname)¶ Возвращает
None
, так как модули расширения не имеют объекта кода.
-
get_source
(fullname)¶ Возвращает
None
, так как модули расширения не имеют исходного кода.
-
-
class
importlib.machinery.
ModuleSpec
(name, loader, *, origin=None, loader_state=None, is_package=None)¶ Спецификация для состояния модуля, связанного с системой импорта. Обычно она отображается как атрибут модуля
__spec__
. В приведенных ниже описаниях имена в круглых скобках указывают на соответствующий атрибут, доступный непосредственно на объекте модуля. Например,module.__spec__.origin == module.__file__
. Обратите внимание, что хотя значения обычно эквивалентны, они могут отличаться, поскольку между двумя объектами нет синхронизации. Таким образом, можно обновить__path__
модуля во время выполнения, и это не будет автоматически отражено в__spec__.submodule_search_locations
.Добавлено в версии 3.4.
-
name
¶
(
__name__
)Строка для полного имени модуля.
-
loader
¶
(
__loader__
)Loader, который должен использоваться при загрузке модуля. Finders всегда должен устанавливать это значение.
-
origin
¶
(
__file__
)Имя места, из которого загружается модуль, например, «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно должно быть задано значение «origin», но оно может быть
None
(по умолчанию), что означает, что оно не определено (например, для пакетов пространства имен).-
submodule_search_locations
¶
(
__path__
)Список строк для поиска подмодулей, если это пакет (
None
в противном случае).-
loader_state
¶
Контейнер дополнительных данных, специфичных для модуля, для использования во время загрузки (или
None
).-
cached
¶
(
__cached__
)Строка для указания места хранения скомпилированного модуля (или
None
).-
parent
¶
(
__package__
)(Только для чтения) Полное квалифицированное имя пакета, под которым модуль должен быть загружен как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов это то же самое, что и
__name__
.-
has_location
¶
Булево значение, указывающее, относится ли атрибут «origin» модуля к загружаемому местоположению или нет.
-
importlib.util
– Код утилиты для импортеров¶
Исходный код: Lib/importlib/util.py.
Этот модуль содержит различные объекты, которые помогают в построении importer.
-
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
).Параметр оптимизация используется для указания уровня оптимизации файла байткода. Пустая строка означает отсутствие оптимизации, поэтому
/foo/bar/baz.py
с оптимизацией''
приведет к пути байткода/foo/bar/__pycache__/baz.cpython-32.pyc
.None
вызывает использование уровня оптимизации интерпретатора. Строковое представление любого другого значения используется, поэтому/foo/bar/baz.py
с оптимизацией2
приведет к пути байткода/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc
. Строковое представление оптимизации может быть только буквенно-цифровым, в противном случае возникает ошибкаValueError
.Параметр debug_override является устаревшим и может использоваться для переопределения системного значения для
__debug__
. ЗначениеTrue
эквивалентно установке optimization в пустую строку. ЗначениеFalse
равнозначно установке оптимизации в1
. Если оба значения debug_override и optimization не равныNone
, то выдается сообщениеTypeError
.Добавлено в версии 3.4.
Изменено в версии 3.5: Был добавлен параметр optimization, а параметр debug_override был устаревшим.
Изменено в версии 3.6: Принимает path-like object.
-
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: Принимает path-like object.
-
importlib.util.
decode_source
(source_bytes)¶ Декодирует заданные байты, представляющие исходный код, и возвращает их в виде строки с универсальными новыми строками (как того требует
importlib.abc.InspectLoader.get_source()
).Добавлено в версии 3.4.
-
importlib.util.
resolve_name
(name, package)¶ Приведите относительное имя модуля к абсолютному.
Если name не содержит ведущих точек, то просто возвращается name. Это позволяет использовать, например,
importlib.util.resolve_name('sys', __spec__.parent)
без проверки, нужен ли аргумент package.ImportError
возникает, если name является относительным именем модуля, но package является ложным значением (например,None
или пустой строкой).ImportError
также будет вызвано, если относительное имя будет скрыто от содержащего его пакета (например, запрос..bacon
из пакетаspam
).Добавлено в версии 3.3.
Изменено в версии 3.9: Чтобы улучшить согласованность с операторами импорта, при попытках некорректного относительного импорта вместо
ImportError
выдавайтеValueError
.
-
importlib.util.
find_spec
(name, package=None)¶ Находит spec для модуля, опционально относительно указанного имени пакета. Если модуль находится в
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
¶ decorator для
importlib.abc.Loader.load_module()
для обработки выбора соответствующего объекта модуля для загрузки. Ожидается, что декорированный метод будет иметь сигнатуру вызова, принимающую два позиционных аргумента (например,load_module(self, module)
), для которых второй аргумент будет модульным объектом, который будет использоваться загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами из-за предположения о двух аргументах.Украшенный метод принимает имя модуля, который должен быть загружен, как ожидается для loader. Если модуль не найден в
sys.modules
, то создается новый. Независимо от того, откуда пришел модуль,__loader__
устанавливается в self, а__package__
устанавливается на основе того, что возвращаетimportlib.abc.InspectLoader.is_package()
(если доступно). Эти атрибуты устанавливаются безусловно для поддержки перезагрузки.Если метод decorated вызывает исключение и модуль был добавлен в
sys.modules
, то модуль будет удален, чтобы предотвратить попадание частично инициализированного модуля вsys.modules
. Если модуль уже был вsys.modules
, то он будет оставлен в покое.Изменено в версии 3.3:
__loader__
и__package__
устанавливаются автоматически (когда это возможно).Изменено в версии 3.4: Установите
__name__
,__loader__
__package__
безусловно для поддержки перезагрузки.Не рекомендуется, начиная с версии 3.4: Теперь механизм импорта напрямую выполняет все функции, предоставляемые этой функцией.
-
@
importlib.util.
set_loader
¶ Декоратор decorator для
importlib.abc.Loader.load_module()
, чтобы установить атрибут__loader__
на возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обернутого метода (т.е.self
) - это то, что должно быть установлено в__loader__
.Изменено в версии 3.4: Установите
__loader__
, если установленоNone
, как если бы атрибут не существовал.Не рекомендуется, начиная с версии 3.4: Механизм импорта позаботится об этом автоматически.
-
@
importlib.util.
set_package
¶ decorator для
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 loader, такие как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: Принимает path-like object.
-
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()
.
Обратите внимание, что если name
является подмодулем (содержит точку), importlib.util.find_spec()
будет импортировать родительский модуль.
import importlib.util
import sys
# For illustrative purposes.
name = 'itertools'
if name in sys.modules:
print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
# If you chose to perform the actual import ...
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)
print(f"{name!r} has been imported")
else:
print(f"can't find the {name!r} module")
Импорт исходного файла напрямую¶
Чтобы импортировать исходный файл Python напрямую, используйте следующий рецепт (только для Python 3.5 и новее):
import importlib.util
import sys
# For illustrative purposes.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)
Реализация ленивого импорта¶
В примере ниже показано, как реализовать ленивый импорт:
>>> import importlib.util
>>> import sys
>>> def lazy_import(name):
... spec = importlib.util.find_spec(name)
... loader = importlib.util.LazyLoader(spec.loader)
... spec.loader = loader
... module = importlib.util.module_from_spec(spec)
... sys.modules[name] = module
... loader.exec_module(module)
... return module
...
>>> lazy_typing = lazy_import("typing")
>>> #lazy_typing is a real module object,
>>> #but it is not loaded in memory yet.
>>> lazy_typing.TYPE_CHECKING
False
Настройка импортера¶
Для глубокой настройки импорта вы обычно хотите реализовать importer. Это означает управление как finder, так и loader. Для искателей есть два варианта в зависимости от ваших потребностей: meta path finder или path entry finder. Первый - это то, что вы поместите на sys.meta_path
, а второй - то, что вы создадите с помощью path entry hook на sys.path_hooks
, который работает с записями sys.path
для потенциального создания искателя. Этот пример покажет вам, как зарегистрировать ваши собственные импортеры, чтобы import использовал их (для создания собственного импортера читайте документацию для соответствующих классов, определенных в этом пакете):
import importlib.machinery
import sys
# For illustrative purposes only.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
importlib.machinery.SOURCE_SUFFIXES)
# Setting up a meta path finder.
# Make sure to put the finder in the proper location in the list in terms of
# priority.
sys.meta_path.append(SpamMetaPathFinder)
# Setting up a path entry finder.
# Make sure to put the path hook in the proper location in the list in terms
# of priority.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
Приближение importlib.import_module()
¶
Сам импорт реализован в коде Python, что позволяет раскрыть большинство механизмов импорта через importlib. Приведенное ниже описание помогает проиллюстрировать различные API, которые раскрывает importlib, предоставляя примерную реализацию importlib.import_module()
(Python 3.4 и новее для использования importlib, Python 3.6 и новее для других частей кода).
import importlib.util
import sys
def import_module(name, package=None):
"""An approximate implementation of import."""
absolute_name = importlib.util.resolve_name(name, package)
try:
return sys.modules[absolute_name]
except KeyError:
pass
path = None
if '.' in absolute_name:
parent_name, _, child_name = absolute_name.rpartition('.')
parent_module = import_module(parent_name)
path = parent_module.__spec__.submodule_search_locations
for finder in sys.meta_path:
spec = finder.find_spec(absolute_name, path)
if spec is not None:
break
else:
msg = f'No module named {absolute_name!r}'
raise ModuleNotFoundError(msg, name=absolute_name)
module = importlib.util.module_from_spec(spec)
sys.modules[absolute_name] = module
spec.loader.exec_module(module)
if path is not None:
setattr(parent_module, child_name, module)
return module