importlib — Реализация импорта
Новое в версии 3.1.
Исходный код: Lib/importlib/__init__.py
1. Введение
Цель пакета importlib двойная. Одна — предоставить реализацию инструкции import (и, следовательно, по аналогии, функцию __import__()) в исходном коде Python. Это обеспечивает реализацию import, которая портативна для любого интерпретатора Python. Это также обеспечивает реализацию, которую легче понять, чем реализацию на языке программирования, отличном от Python.
Во-вторых, компоненты для реализации import доступны в этом пакете, что упрощает создание пользователям собственных пользовательских объектов (обобщенно известных как импортер), которые участвуют в процессе импорта.
См. также
- Инструкция import
- Справочная информация о языке по инструкции
import. - Спецификация пакетов
- Исходная спецификация пакетов. Некоторые семантики изменились с момента написания этого документа (например, перенаправление на основе
Noneвsys.modules). -
The __import__() function - Инструкция
import— это синтаксический сахар для этой функции. - PEP 235
- Импорт на платформах с регистронезависимым написанием
- PEP 263
- Определение кодировок исходного кода Python
- PEP 302
- Новые крючки импорта
- PEP 328
- Импорты: многострочные и абсолютные/относительные
- PEP 366
- Явные относительные импорты основного модуля
- PEP 420
- Неявные пакеты имен
- PEP 451
- Тип ModuleSpec для системы импорта
- PEP 488
- Устранение файлов PYO
- PEP 489
- Многофазная инициализация модулей расширения
- PEP 3120
- Использование UTF-8 в качестве кодировки по умолчанию для исходного кода
- PEP 3147
- Директории репозитория PYC
2. Функции
-
importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0) -
Реализация встроенной функции
__import__().Примечание
Для программного импорта модулей следует использовать
import_module(), а не эту функцию.
-
importlib.import_module(name, package=None) -
Импортировать модуль. Аргумент name указывает, какой модуль импортировать в абсолютном или относительном смысле (например, либо
pkg.modили..mod). Если имя указано в относительном смысле, то аргумент package должен быть установлен в имя пакета, который должен служить точкой отсчёта для разрешения имени пакета (например,import_module('..mod', 'pkg.subpkg')импортируетpkg.mod).Функция
import_module()выступает в качестве упрощающей обертки вокругimportlib.__import__(). Это означает, что все семантики функции производятся отimportlib.__import__(). Самое важное различие между этими двумя функциями состоит в том, чтоimport_module()возвращает указанный пакет или модуль (например,pkg.mod), а__import__()возвращает пакет или модуль верхнего уровня (например,pkg).Если вы динамически импортируете модуль, который был создан после запуска интерпретатора (например, вы создали файл исходного кода Python), вам может потребоваться вызвать
invalidate_caches(), чтобы система импорта обратила внимание на новый модуль.Изменено в версии 3.3: Родительские пакеты импортируются автоматически.
-
importlib.find_loader(name, path=None) -
Найти загрузчик для модуля, необязательно в указанном path. Если модуль находится в
sys.modules, то возвращаетсяsys.modules[name].__loader__, (если загрузчик будетNoneили не установлен, в этом случае возникаетValueError). В противном случае выполняется поиск с использованиемsys.meta_path. Если загрузчик не найден, возвращаетсяNone.У имени с точками его родительские пакеты не импортируются неявно, так как это требует их загрузки, а это может быть нежелательно. Для корректного импорта подмодуля вам необходимо импортировать все родительские пакеты подмодуля и использовать правильный аргумент для path.
Новое в версии 3.3.
Изменено в версии 3.4: Если
__loader__не задано, поднимитеValueError, как и в случае, если атрибут установлен вNone.Устаревшее с версии 3.4: Используйте
importlib.util.find_spec()вместо этого.
-
importlib.invalidate_caches() -
Очистить внутренние кэши поисковиков, хранящихся в
sys.meta_path. Если поисковик реализуетinvalidate_caches(), то он будет вызван для выполнения очистки. Эта функция должна вызываться, если какие-либо модули созданы/установлены во время работы вашей программы, чтобы гарантировать, что все поисковики заметят существование нового модуля.Новое в версии 3.3.
-
importlib.reload(module) -
Перезагрузка ранее импортированного модуля. Аргумент должен быть объектом модуля, поэтому он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите попробовать новую версию, не выходя из интерпретатора Python. Возвращаемое значение — объект модуля (который может отличаться, если повторный импорт приводит к размещению другого объекта в
sys.modules).При выполнении
reload():- Код Python-модуля перекомпилируется, и код на уровне модуля выполняется повторно, определяя новый набор объектов, которые привязываются к именам в словаре модуля, повторно используя загрузчик, который изначально загрузил модуль. Функция
initмодулей расширений не вызывается второй раз. - Как и со всеми другими объектами в Python, старые объекты освобождаются только после того, как их счётчик ссылок станет равным нулю.
- Имена в пространстве имён модуля обновляются, чтобы указывать на любые новые или изменённые объекты.
- Другие ссылки на старые объекты (такие как имена, внешние по отношению к модулю) не перенаправляются на новые объекты, и их необходимо обновить в каждом пространстве имён, если это необходимо.
Существует ряд других нюансов:
Когда модуль перезагружается, его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имён будут переопределять старые определения, поэтому это, как правило, не проблема. Если новая версия модуля не определяет имя, определённое старой версией, старое определение сохраняется. Эта функция может использоваться для преимущества модуля, если он поддерживает глобальную таблицу или кэш объектов — с помощью оператора
tryон может проверить наличие таблицы и пропустить её инициализацию при необходимости:try: cache except NameError: cache = {}В целом, перезагрузка встроенных или динамически загружаемых модулей не очень полезна. Перезагрузка
sys,__main__,builtinsи других ключевых модулей не рекомендуется. Во многих случаях модули расширений не предназначены для инициализации более одного раза и могут аварийно завершиться произвольными способами при перезагрузке.Если модуль импортирует объекты из другого модуля с помощью
from…import…, вызовreload()для другого модуля не переопределяет импортированные из него объекты — один из способов обойти это — повторно выполнить операторfrom, другой — использоватьimportи квалифицированные имена (модуль.имя).Если модуль создаёт экземпляры класса, перезагрузка модуля, определяющего класс, не влияет на определения методов экземпляров — они продолжают использовать старое определение класса. То же самое относится к производным классам.
Введено в версии 3.4.
- Код Python-модуля перекомпилируется, и код на уровне модуля выполняется повторно, определяя новый набор объектов, которые привязываются к именам в словаре модуля, повторно используя загрузчик, который изначально загрузил модуль. Функция
3. importlib.abc – Абстрактные базовые классы, относящиеся к импорту
Исходный код: Lib/importlib/abc.py
Модуль importlib.abc содержит все основные абстрактные базовые классы, используемые модулем import. Некоторые подклассы основных абстрактных базовых классов также предоставляются для помощи в реализации основных АБК.
Иерархия АБК:
object
+-- Finder (deprecated)
| +-- MetaPathFinder
| +-- PathEntryFinder
+-- Loader
+-- ResourceLoader --------+
+-- InspectLoader |
+-- ExecutionLoader --+
+-- FileLoader
+-- SourceLoader
-
class importlib.abc.Finder -
Абстрактный базовый класс, представляющий поисковик.
Устарело начиная с версии 3.3: Используйте
MetaPathFinderилиPathEntryFinderвместо этого.-
abstractmethod find_module(fullname, path=None) -
Абстрактный метод поиска загрузчика для указанного модуля. Изначально описанный в PEP 302, этот метод предназначался для использования в
sys.meta_pathи в подсистеме импорта на основе пути.Изменено в версии 3.4: Возвращает
Noneпри вызове вместо повышенияNotImplementedError.
-
-
class importlib.abc.MetaPathFinder -
Абстрактный базовый класс, представляющий поисковик метапутей. Для совместимости это подкласс
Finder.Введено в версии 3.3.
-
find_spec(fullname, path, target=None) -
Абстрактный метод поиска спецификации для указанного модуля. Если это импорт верхнего уровня, path будет
None. В противном случае это поиск подпакета или модуля, и path будет значением__path__родительского пакета. Если спецификация не найдена, возвращаетсяNone. При передаче,target— это объект модуля, который поисковик может использовать для более обоснованного выбора возвращаемой спецификации.Введено в версии 3.4.
-
find_module(fullname, path) -
Метод унаследованного поиска загрузчика для указанного модуля. Если это импорт верхнего уровня, path будет
None. В противном случае это поиск подпакета или модуля, и path будет значением__path__родительского пакета. Если загрузчик не найден, возвращаетсяNone. Еслиfind_spec()определён, обеспечивается обратная совместимость.Изменено в версии 3.4: Возвращает
Noneпри вызове вместо повышенияNotImplementedError. Может использоватьfind_spec()для обеспечения функциональности.Устарело начиная с версии 3.4: Используйте
find_spec()вместо этого.
-
invalidate_caches() -
Необязательный метод, который при вызове должен очищать любой внутренний кэш, используемый поисковиком. Используется
importlib.invalidate_caches()при очистке кэшей всех поисковиков вsys.meta_path.Изменено в версии 3.4: Возвращает
Noneпри вызове вместоNotImplemented.
-
-
class importlib.abc.PathEntryFinder -
Абстрактный базовый класс, представляющий поисковик элементов пути. Несмотря на некоторое сходство с
MetaPathFinder,PathEntryFinderпредназначен только для использования внутри подсистемы импорта на основе пути, предоставляемойPathFinder. Этот ABC является подклассомFinderтолько для обеспечения совместимости.Введено в версии 3.3.
-
find_spec(fullname, target=None) -
Абстрактный метод поиска описания указанного модуля. Поисковик будет искать модуль только в элементе пути, которому он назначен. Если описание не найдено, возвращается
None. При передачеtarget— это объект модуля, который поисковик может использовать, чтобы лучше понять, какое описание вернуть.Введено в версии 3.4.
-
find_loader(fullname) -
Метод, предназначенный для поиска загрузчика указанного модуля. Возвращает 2-кортеж
(loader, portion), гдеportion— последовательность расположений файловой системы, вносящих вклад в часть пакета с пространством имён. Загрузчик может бытьNone, при этом указываяportion, чтобы показать вклад расположений файловой системы в пакет с пространством имён. Пустой список может быть использован дляportion, чтобы указать, что загрузчик не является частью пакета с пространством имён. ЕслиloaderравноNone, аportion— пустой список, значит не был найден ни загрузчик, ни расположение для пакета с пространством имён (то есть ничего не найдено для модуля).Если
find_spec()определён, то обеспечивается обратная совместимость.Изменено в версии 3.4: Возвращает
(None, [])вместо поднятияNotImplementedError. Используетfind_spec()при его наличии для обеспечения функциональности.Устарело начиная с версии 3.4: Используйте
find_spec()вместо этого.
-
find_module(fullname) -
Конкретная реализация
Finder.find_module(), которая эквивалентнаself.find_loader(fullname)[0].Устарело начиная с версии 3.4: Используйте
find_spec()вместо этого.
-
invalidate_caches() -
Необязательный метод, который, при вызове, должен аннулировать любой внутренний кэш, используемый поисковиком. Используется
PathFinder.invalidate_caches()при аннулировании кэшей всех кэшированных поисковиков.
-
-
class importlib.abc.Loader -
Абстрактный базовый класс для загрузчика. См. PEP 302 для точного определения загрузчика.
-
create_module(spec) -
Метод, возвращающий объект модуля для использования при импорте модуля. Этот метод может возвращать
None, указывая, что должны быть использованы стандартные правила создания модулей.Введено в версии 3.4.
Изменено в версии 3.5: Начиная с Python 3.6, этот метод не будет необязательным, когда определён
exec_module().
-
exec_module(module) -
Абстрактный метод, выполняющий модуль в собственном пространстве имён при импорте или перезагрузке модуля. Модуль должен быть уже инициализирован, когда вызывается exec_module().
Введено в версии 3.4.
-
load_module(fullname) -
Метод, предназначенный для загрузки модуля. Если модуль не может быть загружен, поднимается
ImportError, в противном случае возвращается загруженный модуль.Если запрашиваемый модуль уже существует в
sys.modules, этот модуль должен быть использован и перезагружен. В противном случае загрузчик должен создать новый модуль и вставить его вsys.modulesдо начала любой загрузки, чтобы предотвратить рекурсию при импорте. Если загрузчик вставил модуль, и загрузка завершается неудачей, он должен удалить модуль изsys.modules; модули, уже присутствующие вsys.modulesдо начала выполнения загрузчика, должны оставаться нетронутыми (см.importlib.util.module_for_loader()).Загрузчик должен установить несколько атрибутов в модуле. (Обратите внимание, что некоторые из этих атрибутов могут меняться при перезагрузке модуля):
-
-
__name__ - Имя модуля.
-
-
-
__file__ - Путь к данным модуля (не устанавливается для встроенных модулей).
-
-
-
__cached__ - Путь к скомпилированной версии модуля (не устанавливается, когда атрибут неуместен).
-
-
-
__path__ - Список строк, определяющих путь поиска в рамках пакета. Этот атрибут не устанавливается для модулей.
-
-
-
__package__ - Родительский пакет для модуля/пакета. Если модуль находится на верхнем уровне, его значение равно пустой строке. Декоратор
importlib.util.module_for_loader()может обрабатывать детали для__package__.
-
-
-
__loader__ - Загрузчик, использованный для загрузки модуля. Декоратор
importlib.util.module_for_loader()может обрабатывать детали для__package__.
-
Если
exec_module()доступен, обеспечивается обратная совместимость.Изменено в версии 3.4: Поднимает
ImportErrorпри вызове вместоNotImplementedError. Функциональность предоставляется, еслиexec_module()доступен.Устарело начиная с версии 3.4: Рекомендуемый API для загрузки модуля —
exec_module()(иcreate_module()). Загрузчики должны реализовывать его вместо load_module(). Механизм импорта позаботится обо всех других обязанностях load_module() при реализации exec_module(). -
-
module_repr(module) -
Метод, предназначенный для вычисления и возврата строки представления данного модуля. Стандартное представление типа модуля будет использовать результат этого метода по необходимости.
Введено в версии 3.3.
Изменено в версии 3.4: Сделано необязательным вместо абстрактного метода.
Устарело начиная с версии 3.4: Механизм импорта теперь обрабатывает это автоматически.
-
-
class importlib.abc.ResourceLoader -
Абстрактный базовый класс для загрузчика, который реализует необязательный протокол PEP 302 для загрузки произвольных ресурсов из хранилища.
-
abstractmethod get_data(path) -
Абстрактный метод для возвращения байтов данных, расположенных по адресу path. Загрузчики, у которых есть хранилище наподобие файла, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод для прямого доступа к хранящимся данным.
OSErrorдолжен быть вызван, если path не найден. Ожидается, что path будет сконструирован с помощью атрибута модуля__file__или элемента из__path__пакета.Изменено в версии 3.4: Возвращает
OSErrorвместоNotImplementedError.
-
-
class importlib.abc.InspectLoader -
Абстрактный базовый класс для загрузчика, который реализует необязательный протокол PEP 302 для загрузчиков, которые проверяют модули.
-
get_code(fullname) -
Возвращает объект кода для модуля или
None, если у модуля нет объекта кода (как в случае с встроенным модулем). ВызватьImportError, если загрузчик не может найти указанный модуль.Примечание
Хотя метод имеет реализацию по умолчанию, рекомендуется его переопределять, если это возможно, для повышения производительности.
Изменено в версии 3.4: Больше не абстрактный и предоставлена конкретная реализация.
-
abstractmethod get_source(fullname) -
Абстрактный метод для возвращения исходного кода модуля. Он возвращается в виде текстовой строки с использованием универсальных новых строк, преобразуя все распознанные разделители строк в
'\n'символы. ВозвращаетNoneесли исходный код недоступен (например, для встроенного модуля). ВызываетImportError, если загрузчик не может найти указанный модуль.Изменено в версии 3.4: Возвращает
ImportErrorвместоNotImplementedError.
-
is_package(fullname) -
Абстрактный метод для возвращения значения true, если модуль является пакетом, и false в противном случае.
ImportErrorгенерируется, если загрузчик не может найти модуль.Изменено в версии 3.4: Возвращает
ImportErrorвместоNotImplementedError.
-
static source_to_code(data, path='<string>') -
Создание объекта кода из исходного кода Python.
Аргумент data может быть любым, который поддерживает функция
compile()(т.е. строка или байты). Аргумент path должен быть «путем» к исходному коду, который может быть абстрактным понятием (например, расположение в файле zip).С последующим объектом кода можно выполнить его в модуле, выполнив
exec(code, module.__dict__).Новое в версии 3.4.
Изменено в версии 3.5: Метод стал статическим.
-
exec_module(module) -
Реализация
Loader.exec_module().Новое в версии 3.4.
-
load_module(fullname) -
Реализация
Loader.load_module().Устарело начиная с версии 3.4: Используйте
exec_module()вместо этого.
-
-
class importlib.abc.ExecutionLoader -
Абстрактный базовый класс, унаследованный от
InspectLoader, который, при реализации, помогает модулю выполняться как скрипт. ABC представляет собой необязательный протокол PEP 302.-
abstractmethod get_filename(fullname) -
Абстрактный метод, который должен возвращать значение
__file__для указанного модуля. Если путь недоступен, вызываетсяImportError.Если исходный код доступен, метод должен возвращать путь к исходному файлу, независимо от того, использовался ли байткод для загрузки модуля.
Изменено в версии 3.4: Возвращает
ImportErrorвместоNotImplementedError.
-
-
class importlib.abc.FileLoader(fullname, path) -
Абстрактный базовый класс, который наследуется от
ResourceLoaderиExecutionLoader, предоставляя конкретные реализацииResourceLoader.get_data()иExecutionLoader.get_filename().Аргумент fullname — это полностью разрешенное имя модуля, обрабатываемого загрузчиком. Аргумент path — это путь к файлу модуля.
Новое в версии 3.3.
-
name -
Имя модуля, который может обработать загрузчик.
-
path -
Путь к файлу модуля.
-
load_module(fullname) -
Вызывает суперметод
load_module().Устарело начиная с версии 3.4: Используйте
Loader.exec_module()вместо этого.
-
abstractmethod get_filename(fullname) -
Возвращает
path.
-
abstractmethod get_data(path) -
Читает path как двоичный файл и возвращает из него байты.
-
-
class importlib.abc.SourceLoader -
Абстрактный базовый класс для реализации загрузки файлов исходного кода (и необязательно байткода). Класс наследуется как от
ResourceLoader, так и отExecutionLoader, требуя реализации:ResourceLoader.get_data()-
-
ExecutionLoader.get_filename() - Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.
-
Абстрактные методы, определённые этим классом, предназначены для добавления необязательной поддержки файлов байткода. Отсутствие реализации этих необязательных методов (или их вызов с исключением
NotImplementedError) приводит к тому, что загрузчик работает только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода и байткода; она не позволяет выполнять загрузку без исходного кода, где предоставляется только байткод. Файлы байткода являются оптимизацией для ускорения загрузки, удаляя этап разбора компилятора Python, поэтому нет API, специфичного для байткода.-
path_stats(path) -
Необязательный абстрактный метод, возвращающий словарь
dictс метаданными о заданном пути. Поддерживаемые ключи словаря:-
'mtime'(обязательно): целое или вещественное число, представляющее время модификации исходного кода; -
'size'(необязательно): размер исходного кода в байтах.
Любые другие ключи в словаре игнорируются, чтобы обеспечить возможность будущих расширений. Если путь не может быть обработан, возникает исключение
OSError.Новое в версии 3.3.
Изменено в версии 3.4: Возбуждает исключение
OSErrorвместоNotImplementedError. -
-
path_mtime(path) -
Необязательный абстрактный метод, возвращающий время модификации для указанного пути.
Устарело начиная с версии 3.3: Этот метод устарел в пользу
path_stats(). Вам не нужно его реализовывать, но он по-прежнему доступен для обеспечения обратной совместимости. Возбуждает исключениеOSError, если путь не может быть обработан.Изменено в версии 3.4: Возбуждает исключение
OSErrorвместоNotImplementedError.
-
set_data(path, data) -
Необязательный абстрактный метод, который записывает указанные байты в файл по указанному пути. Любые промежуточные каталоги, которые не существуют, должны быть созданы автоматически.
При записи в путь по причине того, что путь является только для чтения (
errno.EACCES/PermissionError), исключение не распространяется.Изменено в версии 3.4: Больше не вызывает исключение
NotImplementedErrorпри вызове.
-
get_code(fullname) -
Конкретная реализация
InspectLoader.get_code().
-
exec_module(module) - Конкретная реализация
Loader.exec_module().Новое в версии 3.4.
-
load_module(fullname) -
Конкретная реализация
Loader.load_module().Устарело начиная с версии 3.4: Используйте
exec_module()вместо этого.
-
get_source(fullname) -
Конкретная реализация
InspectLoader.get_source().
-
is_package(fullname) -
Конкретная реализация
InspectLoader.is_package(). Модуль определяется как пакет, если его путь к файлу (предоставленныйExecutionLoader.get_filename()) является файлом с именем__init__после удаления расширения файла и само имя модуля не оканчивается на__init__.
4. importlib.machinery – Импортеры и хуки путей
Исходный код: Lib/importlib/machinery.py
Этот модуль содержит различные объекты, помогающие import находить и загружать модули.
-
importlib.machinery.SOURCE_SUFFIXES -
Список строк, представляющих распознаваемые расширения файлов для модулей исходного кода.
Новое в версии 3.3.
-
importlib.machinery.DEBUG_BYTECODE_SUFFIXES -
Список строк, представляющих расширения файлов для модулей байткода без оптимизации.
Новое в версии 3.3.
Устарело начиная с версии 3.5: Используйте
BYTECODE_SUFFIXESвместо этого.
-
importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES -
Список строк, представляющих расширения файлов для оптимизированных модулей байткода.
Новое в версии 3.3.
Устарело начиная с версии 3.5: Используйте
BYTECODE_SUFFIXESвместо этого.
-
importlib.machinery.BYTECODE_SUFFIXES -
Список строк, представляющих распознаваемые расширения файлов для модулей байткода (включая ведущую точку).
Новое в версии 3.3.
Изменено в версии 3.5: Значение больше не зависит от
__debug__.
-
importlib.machinery.EXTENSION_SUFFIXES -
Список строк, представляющих распознаваемые расширения файлов для модулей расширений.
Новое в версии 3.3.
-
importlib.machinery.all_suffixes() -
Возвращает объединённый список строк, представляющих все расширения файлов для модулей, распознаваемые стандартной машиной импорта. Это вспомогательная функция для кода, которому просто нужно знать, может ли путь к файлу в файловой системе потенциально ссылаться на модуль, без необходимости каких-либо подробностей о типе модуля (например,
inspect.getmodulename()).Новое в версии 3.3.
-
class importlib.machinery.BuiltinImporter -
Импортер для встроенных модулей. Все известные встроенные модули перечислены в
sys.builtin_module_names. Этот класс реализует абстрактные классыimportlib.abc.MetaPathFinderиimportlib.abc.InspectLoader.В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.
Изменено в версии 3.5: В рамках PEP 489, импортер встроенных модулей теперь реализует
Loader.create_module()иLoader.exec_module()
-
class importlib.machinery.FrozenImporter -
Импортер для модулей, закодированных в двоичном формате. Этот класс реализует абстрактные базовые классы
importlib.abc.MetaPathFinderиimportlib.abc.InspectLoader.В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.
-
class importlib.machinery.WindowsRegistryFinder -
Поисковик модулей, объявленных в реестре Windows. Этот класс реализует абстрактный базовый класс
importlib.abc.Finder.В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.
Новое в версии 3.3.
-
class importlib.machinery.PathFinder -
Поисковик для
sys.pathи атрибутов пакета__path__. Этот класс реализует абстрактный базовый классimportlib.abc.MetaPathFinder.В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.
-
classmethod find_spec(fullname, path=None, target=None) -
Метод класса, который пытается найти описание модуля, указанного параметром fullname в
sys.pathили, если определено, в path. Для каждого пути, который проверяется, проверяетсяsys.path_importer_cache. Если найдено ненулевое значение, оно используется как поисковик для записи пути для поиска искомого модуля. Если запись не найдена вsys.path_importer_cache, тогда выполняется поиск вsys.path_hooksдля поисковика для записи пути, и, если найден, сохраняется вsys.path_importer_cache, а также запрашивается информация о модуле. Если поисковик не найден, тоNoneсохраняется в кэше и возвращается.Новое в версии 3.4.
Изменено в версии 3.5: Если текущая рабочая директория – представленная пустой строкой – больше недействительна, то возвращается
None, но значение не кэшируется вsys.path_importer_cache.
-
classmethod find_module(fullname, path=None) -
Устаревшая оболочка вокруг
find_spec().Устарело начиная с версии 3.4: Используйте
find_spec()вместо него.
-
classmethod invalidate_caches() -
Вызывает
importlib.abc.PathEntryFinder.invalidate_caches()для всех поисковиков, сохранённых вsys.path_importer_cache.
Изменено в версии 3.4: Вызывает объекты в
sys.path_hooksс текущей рабочей директорией для''(т. е. пустой строкой). -
-
class importlib.machinery.FileFinder(path, *loader_details) -
Конкретная реализация
importlib.abc.PathEntryFinder, которая кэширует результаты из файловой системы.Аргумент path — это директория, за поиск в которой отвечает данный поисковик.
Аргумент loader_details — это переменное количество кортежей по 2 элемента, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознаёт. Загрузчики предполагаются вызываемыми, принимающими два аргумента: имя модуля и путь к найденному файлу.
Поисковик будет кэшировать содержимое директории по мере необходимости, вызывая stat для каждого поиска модуля, чтобы убедиться, что кэш не устарел. Поскольку устаревание кэша зависит от точности информации операционной системы о состоянии файловой системы, существует потенциальная гонка при поиске модуля, создании нового файла и последующем поиске модуля, представляемого новым файлом. Если операции происходят достаточно быстро, чтобы вписаться в разрешение вызовов stat, поиск модуля завершится неудачей. Чтобы предотвратить это, при динамическом создании модуля убедитесь, что вы вызываете
importlib.invalidate_caches().Новое в версии 3.3.
-
path -
Путь, в котором будет искать поисковик.
-
find_spec(fullname, target=None) -
Попытка найти описание для обработки fullname в
path.Новое в версии 3.4.
-
find_loader(fullname) -
Попытка найти загрузчик для обработки fullname в
path.
-
invalidate_caches() -
Очистить внутренний кэш.
-
classmethod path_hook(*loader_details) -
Метод класса, который возвращает замыкание для использования в
sys.path_hooks. ЭкземплярFileFinderвозвращается замыканием, используя аргумент path, переданный в замыкание непосредственно, и loader_details косвенно.Если аргумент замыкания не является существующей директорией, то возбуждается исключение
ImportError.
-
-
class importlib.machinery.SourceFileLoader(fullname, path) -
Конкретная реализация
importlib.abc.SourceLoaderпутем наследования отimportlib.abc.FileLoaderи предоставления некоторых конкретных реализаций других методов.Новое в версии 3.3.
-
name -
Имя модуля, который будет обрабатывать этот загрузчик.
-
path -
Путь к исходному файлу.
-
is_package(fullname) -
Возвращает true, если
pathкажется относится к пакету.
-
path_stats(path) -
Конкретная реализация
importlib.abc.SourceLoader.path_stats().
-
set_data(path, data) -
Конкретная реализация
importlib.abc.SourceLoader.set_data().
-
load_module(name=None) -
Конкретная реализация
importlib.abc.Loader.load_module(), где указание имени загружаемого модуля необязательно.
-
-
class importlib.machinery.SourcelessFileLoader(fullname, path) -
Конкретная реализация
importlib.abc.FileLoader, которая может импортировать файлы байткода (то есть файлы исходного кода отсутствуют).Обратите внимание, что непосредственное использование файлов байткода (а не файлов исходного кода) препятствует использованию ваших модулей всеми реализациями Python или новыми версиями Python, которые изменяют формат байткода.
Введено в версии 3.3.
-
name -
Имя модуля, за который отвечает загрузчик.
-
path -
Путь к файлу байткода.
-
is_package(fullname) -
Определяет, является ли модуль пакетом на основе
path.
-
get_source(fullname) -
Возвращает
None, так как у файлов байткода нет исходного кода, когда используется этот загрузчик.
-
load_module(name=None)
Конкретная реализация
importlib.abc.Loader.load_module(), где указание имени загружаемого модуля необязательно. -
-
class importlib.machinery.ExtensionFileLoader(fullname, path) -
Конкретная реализация
importlib.abc.ExecutionLoaderдля модулей расширений.Аргумент fullname указывает имя модуля, который должен поддерживаться загрузчиком. Аргумент path — путь к файлу модуля расширения.
Введено в версии 3.3.
-
name -
Имя модуля, который поддерживает загрузчик.
-
path -
Путь к модулю расширения.
-
create_module(spec) -
Создаёт объект модуля из заданного описания в соответствии с PEP 489.
Введено в версии 3.5.
-
exec_module(module) -
Инициализирует заданный объект модуля в соответствии с PEP 489.
Введено в версии 3.5.
-
is_package(fullname) -
Возвращает
True, если путь к файлу указывает на пакет, в котором находится модуль__init__, на основеEXTENSION_SUFFIXES.
-
get_code(fullname) -
Возвращает
None, так как у модулей расширений нет объекта кода.
-
get_source(fullname) -
Возвращает
None, так как у модулей расширений нет исходного кода.
-
get_filename(fullname) -
Возвращает
path.Введено в версии 3.4.
-
-
class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None) -
Описание состояния модуля, связанного с системой импорта.
Введено в версии 3.4.
-
name
(
__name__)Строка для полностью квалифицированного имени модуля.
-
loader
(
__loader__)Используемый загрузчик. Для пакетов имён пространства это значение должно быть установлено в
None.-
origin
(
__file__)Имя места, откуда загружается модуль, например, «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно «origin» должен быть задан, но он может быть
None(по умолчанию), что означает, что он не указан.-
submodule_search_locations
(
__path__)Список строк, где можно найти подмодули, если это пакет (
Noneв противном случае).-
loader_state
Контейнер дополнительных данных, специфичных для модуля, используемых во время загрузки (или
None).-
cached
(
__cached__)Строка, в которой должен храниться скомпилированный модуль (или
None).-
parent
(
__package__)(только для чтения) Полностью квалифицированное имя пакета, к которому принадлежит модуль в качестве подмодуля (или
None).-
has_location
Логическое значение, указывающее, ссылается ли атрибут «origin» модуля на загружаемое местоположение.
-
5. importlib.util – Код вспомогательных функций для импортёров
Исходный код: Lib/importlib/util.py
Этот модуль содержит различные объекты, которые помогают в создании импортёра.
-
importlib.util.MAGIC_NUMBER -
Байты, которые представляют номер версии байткода. Если вам нужна помощь с загрузкой/записью байткода, обратитесь к
importlib.abc.SourceLoader.Введено в версии 3.4.
-
importlib.util.cache_from_source(path, debug_override=None, *, optimization=None) -
Возвращает путь PEP 3147/PEP 488 к файлу скомпилированных байтов, связанному с исходным путём path. Например, если path —
/foo/bar/baz.py, возвращаемое значение будет/foo/bar/__pycache__/baz.cpython-32.pycдля Python 3.2. Строкаcpython-32взята из текущего магического тега (см.get_tag(); еслиsys.implementation.cache_tagне определён, будет поднята ошибкаNotImplementedError).Параметр optimization используется для указания уровня оптимизации файла байткода. Пустая строка представляет отсутствие оптимизации, поэтому
/foo/bar/baz.pyс optimization =''приведет к пути к байткоду/foo/bar/__pycache__/baz.cpython-32.pyc.Noneиспользует уровень оптимизации интерпретатора. Представление любого другого значения в строке используется, поэтому/foo/bar/baz.pyс optimization =2приведет к пути к байткоду/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc. Строковое представление optimization может содержать только буквенно-цифровые символы, в противном случае поднимается ошибкаValueError.Параметр debug_override устарел и может использоваться для переопределения системного значения для
__debug__. ЗначениеTrueэквивалентно установке optimization в пустую строку. ЗначениеFalseтакое же, как установка optimization в1. Если ни debug_override, ни optimization неNone, поднимается исключениеTypeError.Введено в версии 3.4.
Изменено в версии 3.5: Добавлен параметр optimization, а параметр debug_override устарел.
-
importlib.util.source_from_cache(path) -
Учитывая путь к имени файла PEP 3147, верните путь к соответствующему файлу исходного кода. Например, если путь равен
/foo/bar/__pycache__/baz.cpython-32.pyc, возвращаемый путь будет/foo/bar/baz.py. path не обязательно должен существовать, однако, если он не соответствует формату PEP 3147 или PEP 488, будет поднятаValueError. Еслиsys.implementation.cache_tagне определено, то поднимаетсяNotImplementedError.Добавлена в версии 3.4.
-
importlib.util.decode_source(source_bytes) -
Декодируйте заданные байты, представляющие исходный код, и верните их как строку с универсальными переходами на новую строку (как требуется в
importlib.abc.InspectLoader.get_source()).Добавлена в версии 3.4.
-
importlib.util.resolve_name(name, package) -
Преобразуйте относительное имя модуля в абсолютное.
Если у name нет ведущих точек, то просто возвращается name. Это позволяет использовать такие конструкции, как
importlib.util.resolve_name('sys', __package__), без проверки необходимости аргумента package.ValueErrorподнимается, если name является относительным именем модуля, но package имеет ложное значение (например,Noneили пустая строка).ValueErrorтакже поднимается, если относительное имя выходит за пределы содержащего пакета (например, запрос..baconизнутри пакетаspam).Добавлена в версии 3.3.
-
importlib.util.find_spec(name, package=None) -
Найти спецификацию модуля, необязательно относительно указанного имени package. Если модуль находится в
sys.modules, то возвращаетсяsys.modules[name].__spec__(если спецификация неNoneили не установлена, в этом случае поднимаетсяValueError). В противном случае выполняется поиск с использованиемsys.meta_path. Если спецификация не найдена, возвращаетсяNone.Если name относится к подмодулю (содержит точку), родительский модуль автоматически импортируется.
name и package работают так же, как и для
import_module().Добавлена в версии 3.4.
-
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)), для которого второй аргумент будет объектом модуля object, который будет использоваться загрузчиком. Обратите внимание, что декоратор не будет работать с статическими методами из-за предположения о двух аргументах.Декорированный метод будет принимать имя загружаемого модуля, как ожидается для загрузчика. Если модуль не найден в
sys.modules, то создаётся новый. Независимо от источника происхождения модуля,__loader__устанавливается в self, а__package__устанавливается на основе того, что возвращаетimportlib.abc.InspectLoader.is_package()(если доступно). Эти атрибуты устанавливаются безусловно для поддержки перезагрузки.Если во время выполнения декорированного метода произойдёт исключение, а модуль был добавлен в
sys.modules, то модуль будет удалён, чтобы предотвратить оставление частично инициализированного модуля вsys.modules. Если модуль уже находился вsys.modules, то он остаётся на месте.Изменено в версии 3.3:
__loader__и__package__автоматически устанавливаются (если возможно).Изменено в версии 3.4: Безусловно устанавливаются
__name__,__loader__и__package__для поддержки перезагрузки.Устарело начиная с версии 3.4: Механизм импорта теперь напрямую выполняет все функции, предоставляемые этой функцией.
-
@importlib.util.set_loader -
Декоратор для
importlib.abc.Loader.load_module()для установки атрибута__loader__в возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обернутого метода (т. е.self) — это то, что должно быть установлено в__loader__.Изменено в версии 3.4: Установите
__loader__, если он установлен вNone, как если бы атрибут не существовал.Устарело начиная с версии 3.4: Механизм импорта автоматически позаботится об этом.
-
@importlib.util.set_package -
Декоратор для
importlib.abc.Loader.load_module()для установки атрибута__package__в возвращаемом модуле. Если__package__установлен и имеет значение отличное отNone, он не будет изменён.Устарело начиная с версии 3.4: Механизм импорта автоматически позаботится об этом.
-
importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None) -
Функция-фабрика для создания экземпляра
ModuleSpecна основе загрузчика. Параметры имеют то же значение, что и для ModuleSpec. Функция использует доступные API загрузчика, такие какInspectLoader.is_package(), для заполнения любой недостающей информации в спецификации.Добавлена в версии 3.4.
-
importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None) -
Функция-фабрика для создания экземпляра
ModuleSpecна основе пути к файлу. Недостающая информация будет заполнена в спецификации с использованием API загрузчика и по умолчанию, что модуль будет файлового типа.Добавлена в версии 3.4.
-
class importlib.util.LazyLoader(loader) -
Класс, откладывающий выполнение загрузчика модуля до тех пор, пока у модуля не будет обращено к какому-либо атрибуту.
Этот класс только работает с загрузчиками, которые определяют
exec_module()как контроль над тем, какой тип модуля используется для модуля. По тем же причинам метод загрузчикаcreate_module()будет проигнорирован (т.е., метод загрузчика должен возвращать толькоNone; это исключаетBuiltinImporterиExtensionFileLoader). Наконец, модули, которые подменяют объект, помещённый вsys.modules, не будут работать, так как нет безопасного способа правильно заменить ссылки на модули во всём интерпретаторе; в этом случае генерируетсяValueError.Примечание
Для проектов, где время запуска имеет решающее значение, этот класс позволяет потенциально минимизировать стоимость загрузки модуля, если он никогда не используется. Для проектов, где время запуска не является существенным, использование этого класса сильно не рекомендуется из-за сообщений об ошибках, созданных во время загрузки, которые откладываются и, следовательно, появляются вне контекста.
Введено в версии 3.5.
-
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))
-
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/importlib.html