importlib — Реализация import

Добавлено в версии 3.1.

Исходный код: Lib/importlib/__init__.py


Введение

Назначение пакета importlib - двухкратное. Нужно обеспечить внедрение import инструкция (и таким образом, следовательно, функция __import__()) в источнике Python код. Это обеспечивает реализацию import, которая переносится на любой Python интерпретатор. Это также обеспечивает реализацию, которую легче понять, чем реализацию на языке программирования, отличном от Python.

Во-вторых, компоненты для реализации import представлены в этом пакете, что упрощает пользователям создание собственных пользовательских объектов (обычно называемых импортерами) для участия в процессе импорта.

См.также

Инструкция import
Справочник по языку для import инструкция.
Packages specification
Оригинальная спецификация пакетов. Некоторые семантики изменились с момента написания этого документа (например, перенаправление на основе None в sys.modules).
Функция __import__()
import инструкция является синтаксическим сахаром для этой функции.
PEP 235
Импорт на платформах без учета регистра
PEP 263
Определяющий кодировки исходного кода Python
PEP 302
Новые хуки импорта
PEP 328
Импорт: многострочный и абсолютный/относительный
PEP 366
Основной модуль явный относительный импорт
PEP 420
Неявные пакеты пространства имен
PEP 451
Тип ModuleSpec для системы импорта
PEP 488
Исключение файлов PYO
PEP 489
Инициализация модуля многофазного расширения
PEP 552
Детерминированный pycs
PEP 3120
Использование UTF-8 в качестве кодировки источника по умолчанию
PEP 3147
Каталоги репозитария PYC

Функции

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)

Реализация встроенной функции __import__().

Примечание

При программном импорте модулей вместо этой функции следует использовать import_module().

importlib.import_module(name, package=None)

Импорт модуля. Аргумент name определяет что модуль импортировать в абсолютных или относительных терминах (например, или pkg.mod или ..mod). Если имя определено в относительном выражении, то аргумент package должен быть установлен в название пакета, который должен действовать как якорь для решения имени пакета (например, import_module('..mod', 'pkg.subpkg') импортирует pkg.mod).

Функция import_module() действует как упрощающая обертку вокруг importlib.__import__(). Это означает, что все семантики функции получены из importlib.__import__(). Наиболее важным отличием этих двух функций является то, что import_module() возвращает указанный пакет или модуль (например, pkg.mod), в то время как __import__() возвращает пакет или модуль верхнего уровня (например, pkg).

Если вы динамично импортируете модуль, который был создан, так как интерпретатор начал выполнение (например, создал исходный файл Python), вы, возможно, должны назвать invalidate_caches() для нового модуля, который будет замечен системой импорта.

Изменено в версии 3.3: Родительские пакеты импортируются автоматически.

importlib.find_loader(name, path=None)

Найти загрузчик для модуля, при необходимости в пределах указанного path. Если модуль находится в sys.modules, то sys.modules[name].__loader__ - возвращенный (если погрузчик не был бы None или не установлен, в этом случае ValueError поднят). Иначе поиск, используя sys.meta_path сделан. None является возвращенный, если загрузчик не найден.

Пунктирное имя не имеет своих родителей, которые неявно импортированы как требующие их загрузки и которые могут быть нежелательными. Для правильного импорта подмодуля необходимо импортировать все родительские пакеты подмодуля и использовать правильный аргумент для path.

Добавлено в версии 3.3.

Изменено в версии 3.4: Если __loader__ не установлен, поднимется ValueError, как когда атрибут установлен в None.

Не рекомендуется, начиная с версии 3.4: Используйте importlib.util.find_spec() вместо этого.

importlib.invalidate_caches()

Объявление недействительными внутренних кэшей поисковиков, хранящихся в sys.meta_path. Если поисковик реализует invalidate_caches(), он будет вызван для выполнения признания недействительным. Эта функция должна вызываться, если какие-либо модули создаются/устанавливаются во время работы программы, чтобы гарантировать, что все поисковики заметят существование нового модуля.

Добавлено в версии 3.3.

importlib.reload(module)

Перезагрузить ранее импортированный module. Аргумент должен быть объектом модуля, поэтому он должен быть успешно импортирован ранее. Это полезно, если исходный файл модуля был отредактирован с помощью внешнего редактора и требуется опробовать новую версию без выхода из Python интерпретатор. Объект возвращает значение является объектом модуля (который может отличаться, если повторный импорт приводит к помещению другого объекта в sys.modules).

Когда reload() - выполняется:

  • код модуля Python повторно собран, и уровень модуля код повторно выполнен, определив новый набор объектов, которые связаны с именами в словаре модуля, снова использовав загрузчик, который первоначально загрузил модуль. Функция init модулей расширения не вызывается второй раз.
  • Как и для всех других объектов в Python, старые объекты восстанавливаются только после того, как число привязок падает до нуля.
  • Имена в пространстве имен модулей обновляются для указания на новые или измененные объекты.
  • Другие ссылки на старые объекты (такие как имена, внешние по отношению к модулю) не являются повторными ссылками на новые объекты и должны обновляться в каждом пространстве имен, где они возникают, если это необходимо.

Есть и ряд других предостережений:

При перезагрузке модуля его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имен переопределят старые определения, поэтому это, как правило, не является проблемой. Если новая версия модуля не определяет имя, определенное старой версией, старое определение остается. Эта особенность может быть используемый к преимуществу модуля, если это поддерживает глобальный стол или кэш объектов — с try инструкция, это может проверить на присутствие таблицы и пропустить свою инициализацию при желании:

try:
    cache
except NameError:
    cache = {}

Как правило, не очень полезно перезагружать встроенные или динамически загруженные модули. Перезагрузка модулей sys, __main__, builtins и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не предназначены для инициализации более одного раза и могут отказывать произвольными способами при перезагрузке.

Если модуль импортирует объекты из другого модуля с помощью fromimport…, называя reload() для другого модуля не пересматривает объекты, импортированные из него —, один путь вокруг этого состоит в том, чтобы повторно выполнить from инструкция, другой должен использовать import и составные имена (module.name) вместо этого.

Если модуль иллюстрирует примерами сущности класса, перезагружая модуль, который определяет класс, не затрагивает определения метода сущности —, они продолжают использовать старое определение класса. То же самое относится и к производным классам.

Добавлено в версии 3.4.

Изменено в версии 3.7: ModuleNotFoundError возникает, когда у перезагружаемого модуля отсутствует ModuleSpec.

importlib.abc – Абстрактные базовые классы, связанные с импортом

Исходный код: Lib/importlib/abc.py


Модуль importlib.abc содержит все базовые абстрактные базовые классы используемые import. Некоторые подклассы основных абстрактных базовых классов также обеспечены, чтобы помочь в осуществлении основного ABCs.

Иерархия ABC:

object
 +-- Finder (deprecated)
 |    +-- MetaPathFinder
 |    +-- PathEntryFinder
 +-- Loader
      +-- ResourceLoader --------+
      +-- InspectLoader          |
           +-- ExecutionLoader --+
                                 +-- FileLoader
                                 +-- SourceLoader
class importlib.abc.Finder

Абстрактный базовый класс, представляющий поисковик.

Не рекомендуется, начиная с версии 3.3: Вместо этого используйте MetaPathFinder или PathEntryFinder.

abstractmethod find_module(fullname, path=None)

Абстрактный метод поиска загрузчик для указанного модуля. Первоначально указанный в PEP 302, этот метод предназначался для использования в sys.meta_path и в подсистеме импорта на основе путей.

Изменено в версии 3.4: Возвращает значение None при вызове вместо повышения значения NotImplementedError.

class importlib.abc.MetaPathFinder

Абстрактный базовый класс, представляющий поисковик мета-пути. Для совместимости это подкласс Finder.

Добавлено в версии 3.3.

find_spec(fullname, path, target=None)

Абстрактный метод поиска спецификации для указанного модуля. Если это импорт верхнего уровня, path будет None. Иначе это - поиск подпакета или модуля, и path будет значение __path__ от родительского пакета. Если spec не может быть найден, None является возвращенный. При передаче, target - это объект модуля, который поисковик может использовать, чтобы сделать более образованное предположение о том, что spec возвращает . importlib.util.spec_from_loader() может быть полезным для реализации конкретных MetaPathFinders.

Добавлено в версии 3.4.

find_module(fullname, path)

Устаревший метод для нахождения загрузчика для указанного модуля. Если это импорт верхнего уровня, path будет None. Иначе это - поиск подпакета или модуля, и path будет значение __path__ от родительского пакета. Если загрузчик не может быть найден, None является возвращенный.

Если find_spec() определен, назад совместимая функциональность обеспечена.

Изменено в версии 3.4: Возвращает значение None при вызове вместо повышения значения NotImplementedError. Может использовать find_spec() для обеспечения функциональности.

Не рекомендуется, начиная с версии 3.4: Используйте find_spec() вместо этого.

invalidate_caches()

Дополнительный метод, который, когда его называют, должен лишить законной силы любой внутренний кэш используемый искателем. Используется importlib.invalidate_caches() при признании недействительными кэшей всех поисковиков на sys.meta_path.

Изменено в версии 3.4: Возвращает None при вызове вместо NotImplemented.

class importlib.abc.PathEntryFinder

Абстрактный базовый класс, представляющий поисковик пути. Хотя он имеет некоторые сходства с MetaPathFinder, PathEntryFinder предназначен для использования только в подсистеме импорта на основе путей, предоставляемой PathFinder. Этот ABC - подкласс Finder по причинам совместимости только.

Добавлено в версии 3.3.

find_spec(fullname, target=None)

Абстрактный метод поиска спецификации для указанного модуля. Поиск модуля будет выполняться только в пределах путей входа, которому он назначен. Если spec не может быть найден, None является возвращенный. При передаче, target - это объект модуля, который поисковик может использовать, чтобы сделать более образованное предположение о том, что spec возвращает . importlib.util.spec_from_loader() может быть полезным для реализации конкретных PathEntryFinders.

Добавлено в версии 3.4.

find_loader(fullname)

Устаревший метод для нахождения загрузчика для указанного модуля. Возвращает 2-кортеж (loader, portion), где portion - последовательность расположений файловой системы, вносящих вклад в часть пакета пространства имен. Загрузчик может быть None при указании portion для обозначения вклада расположений файловой системы в пакет пространства имен. Пустой список может быть используемый для portion, чтобы показать, что погрузчик не часть пакета пространства имен. Если loader is None и portion является пустым списком, то загрузчик или расположение для пакета пространства имен не были найдены (т.е. не удалось найти что-либо для модуля).

Если find_spec() определен тогда, назад совместимая функциональность обеспечена.

Изменено в версии 3.4: Возвращает (None, []) вместо повышения NotImplementedError. Использует find_spec(), когда это доступно, для обеспечения функциональности.

Не рекомендуется, начиная с версии 3.4: Используйте find_spec() вместо этого.

find_module(fullname)

Конкретное осуществление Finder.find_module(), которое эквивалентно self.find_loader(fullname)[0].

Не рекомендуется, начиная с версии 3.4: Используйте find_spec() вместо этого.

invalidate_caches()

Дополнительный метод, который, когда его называют, должен лишить законной силы любой внутренний кэш используемый искателем. Используется PathFinder.invalidate_caches() при признании недействительными кэшей всех кэшированных поисковиков.

class importlib.abc.Loader

Абстрактный базовый класс для загрузчик. Точное определение загрузчика см. в разделе PEP 302.

Загрузчики, которые хотят поддерживать считывание ресурсов, должны реализовывать метод get_resource_reader(fullname), как указано в параметре importlib.abc.ResourceReader.

Изменено в версии 3.7: Введен дополнительный метод get_resource_reader().

create_module(spec)

Метод, возвращающий объект модуля для использования при импорте модуля. Этот метод может возвращает None, указывая, что семантика создания модуля по умолчанию должна произойти.

Добавлено в версии 3.4.

Изменено в версии 3.5: Начиная с Python 3.6, этот метод не будет обязательным, если exec_module() определен.

exec_module(module)

Абстрактный метод, который выполняет модуль в собственном пространстве имен при импорте или перезагрузке модуля. Модуль должен уже быть инициализирован, когда exec_module() называют. Когда этот метод существует, create_module() должен быть определен.

Добавлено в версии 3.4.

Изменено в версии 3.6: Необходимо также определить create_module().

load_module(fullname)

Устаревший метод загрузки модуля. Если модуль не может быть загружен, ImportError поднимается, в противном случае загруженный модуль становится возвращенный.

Если запрошенный модуль уже существует в sys.modules, этот модуль должен быть используемый и перезагружен. Иначе погрузчик должен создать новый модуль и вставить его в sys.modules, прежде чем любая погрузка начнется, чтобы предотвратить рекурсию от импорта. Если загрузчик вставил модуль и нагрузка не прошла, он должен быть удален загрузчиком из sys.modules; модули, уже находящиеся в sys.modules перед началом выполнения загрузчика, следует оставить в покое (см. importlib.util.module_for_loader()).

Загрузчик должен установить несколько атрибуты на модуле. (Обратите внимание, что некоторые из этих атрибуты могут меняться при перезагрузке модуля):

  • __name__ имя модуля.
  • __file__ путь к месту хранения данных модуля (не установлен для встроенных модулей).
  • __cached__ путь к месту хранения скомпилированной версии модуля (не задается, когда атрибут будет неуместным).
  • __path__ список строки, указывающих путь поиска в пакете. Этот атрибут не установлен на модулях.
  • __package__ родительский пакет для модуля/пакета. Если модуль является модулем верхнего уровня, он имеет значение пустого строка. Декоратор importlib.util.module_for_loader() может обращаться с деталями для __package__.
  • __loader__ загрузчик используемый для загрузки модуля. Декоратор importlib.util.module_for_loader() может обращаться с деталями для __package__.

Когда доступна функция exec_module(), обеспечивается обратная совместимость функциональных возможностей.

Изменено в версии 3.4: Поднять ImportError при вызове вместо NotImplementedError. Функциональные возможности, предоставляемые при наличии exec_module().

Не рекомендуется, начиная с версии 3.4: Рекомендуемый API для загрузки модуля - exec_module()create_module()). Загрузчики должны реализовывать его вместо load_module (). Импортный механизм принимает на себя все другие обязанности load_module () при внедрении exec_module ().

module_repr(module)

Устаревший метод, который при реализации вычисляет и возвращает rep данного модуля в виде строка. Тип модуля repr () по умолчанию будет использовать результат этого метода.

Добавлено в версии 3.3.

Изменено в версии 3.4: Сделал необязательным вместо абстрактметода.

Не рекомендуется, начиная с версии 3.4: Импортный механизм теперь позаботится об этом автоматически.

class importlib.abc.ResourceReader

Абстрактный базовый класс для обеспечения возможности чтения resources.

С точки зрения этой ABC, resource - это бинарный артефакт, который поставляется внутри пакета. Как правило, это файл данных, который находится рядом с файлом __init__.py пакета. Целью этого класса является содействие абстрагированию доступа к таким файлам данных, чтобы не было значения, хранятся ли пакет и его файлы данных, например, в zip-файле, а не в файловой системе.

Для любого из методов этого класса ожидается, что аргумент resource будет путеподобный объект, который концептуально представляет только имя файла. Это означает, что пути подкаталогов не должны включаться в аргумент resource. Это связано с тем, что расположение пакета, для которого установлено считывающее устройство, действует как «каталог». Поэтому метафорой каталогов и имен файлов являются пакеты и ресурсы соответственно. Поэтому ожидается, что сущности этого класса будут непосредственно соотноситься с определенным пакетом (вместо возможного представления нескольких пакетов или модуля).

Ожидается, что загрузчики, которые хотят поддерживать считывание ресурсов, предоставят метод с именем get_resource_reader(fullname), который возвращаетобъект, реализующий интерфейс этого ABC. Если модуль, определенный fullname, не является пакетом, этот метод должен возвращает None. Объект, совместимый с этим ABC, должен быть возвращенный только в том случае, если указанный модуль является пакетом.

Добавлено в версии 3.7.

abstractmethod open_resource(resource)

Возвращает открытый файлоподобный объект для двоичного чтения resource.

Если ресурс не может быть найден, возникает сообщение FileNotFoundError.

abstractmethod resource_path(resource)

Возвращает путь файловой системы к resource.

Если ресурс конкретно не существует в файловой системе, поднимите FileNotFoundError.

abstractmethod is_resource(name)

Возвращает значение True, если именованный name считается ресурсом. FileNotFoundError вызывается, если name не существует.

abstractmethod contents()

Возвращает итерируемую строку над содержимым пакета. Обратите внимание, что не требуется, что все имена возвращенный iterator быть фактическими ресурсами, например, это приемлемо для имен возвращает , для которых is_resource() был бы ложным.

Разрешение имен нересурса быть возвращенный должно допускать ситуации, где, как пакет и его ресурсы сохранены, известны априорно, и имена нересурса были бы полезны. Для сущность допускается возврат имен подкаталогов, так что, когда известно, что пакет и ресурсы хранятся в файловой системе, эти имена подкаталогов могут быть используемый непосредственно.

Абстрактный метод возвращает итерабль без элементов.

class importlib.abc.ResourceLoader

Абстрактный базовый класс для загрузчик, реализующего дополнительный протокол PEP 302 для загрузки произвольных ресурсов из внутреннего сервера хранения.

Не рекомендуется, начиная с версии 3.7: Эта ABC устарела в пользу поддержки загрузки ресурсов через importlib.abc.ResourceReader.

abstractmethod get_data(path)

Абстрактный метод для возвращает байтов для данных, расположенных в точке path. Загрузчики, которые имеют файлообразный бэкэнд хранения, позволяющий хранить произвольные данные, могут реализовать этот абстрактный метод для предоставления прямого доступа к хранящимся данным. OSError должен быть поднят, если path не может быть найден. Предполагается, что path будет создан с использованием модуля __file__ атрибут или элемента из пакета __path__.

Изменено в версии 3.4: Поднимает OSError вместо NotImplementedError.

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() super.

Не рекомендуется, начиная с версии 3.4: Используйте Loader.exec_module() вместо этого.

abstractmethod get_filename(fullname)

Прибыль path.

abstractmethod get_data(path)

Считывает path как двоичный файл и возвращает байты из него.

class importlib.abc.SourceLoader

Абстрактный базовый класс для реализации загрузки исходного (и необязательно байт-кода) файла. Класс наследует как от ResourceLoader, так и от ExecutionLoader, требуя реализации:

Абстрактные методы, определенные этим классом, должны добавить дополнительную поддержку файлов байт-кодов. Осуществление этих дополнительных методов (или порождение их поднять NotImplementedError) заставляют погрузчик только работать с источником код. Осуществление методов позволяет погрузчику работать с исходными файлами and байткод; он не допускает sourceless загрузки, где предусмотрен только байт-код. Файлы Bytecode - оптимизация, чтобы ускорить погрузку, удаляя шаг парсинг компилятора Python’s, и таким образом, никакой байткод-определенный API не выставлен.

path_stats(path)

Необязательный абстрактный метод, возвращающий dict, содержащий метаданные о указанном пути. Поддерживаются словарные ключи:

  • 'mtime' (обязательное): целое число или число с плавающей запятой, представляющее время изменения исходного код; (Дополнительный) 'size': размер в байтах источника код.

Любые другие ключи в словаре игнорируются, что позволяет расширять их в будущем. Если путь не может быть обработан, OSError поднят.

Добавлено в версии 3.3.

Изменено в версии 3.4: Поднимите OSError вместо NotImplementedError.

path_mtime(path)

Необязательный абстрактный метод, возвращающий время изменения для указанного пути.

Не рекомендуется, начиная с версии 3.3: Этот метод устарел в пользу path_stats(). Его не нужно реализовывать, но он по- прежнему доступен в целях совместимости. Поднимите OSError, если путь не может быть обработан.

Изменено в версии 3.4: Поднимите OSError вместо NotImplementedError.

set_data(path, data)

Дополнительный абстрактный метод, записывающий указанные байты в путь к файлу. Все несуществующие промежуточные каталоги должны создаваться автоматически.

При сбое записи в тракт, поскольку тракт доступен только для чтения (errno.EACCES/PermissionError), не распространяйте исключение.

Изменено в версии 3.4: Больше не поднимает NotImplementedError при вызове.

get_code(fullname)

Конкретное осуществление InspectLoader.get_code().

exec_module(module)

Конкретное осуществление Loader.exec_module().

Добавлено в версии 3.4.

load_module(fullname)

Конкретное осуществление Loader.load_module().

Не рекомендуется, начиная с версии 3.4: Используйте exec_module() вместо этого.

get_source(fullname)

Конкретное осуществление InspectLoader.get_source().

is_package(fullname)

Конкретное осуществление InspectLoader.is_package(). Модуль полон решимости быть пакетом, если его путь к файлу (в соответствии с ExecutionLoader.get_filename()) является файлом по имени __init__, когда расширение файла удалено и, само имя модуля не заканчивается в __init__.

importlib.resources - Ресурсы

Исходный код: Lib/importlib/resources.py


Добавлено в версии 3.7.

Этот модуль усиливает систему импорта Python’s, чтобы обеспечить доступ к resources в packages. Если можно импортировать пакет, можно получить доступ к ресурсам этого пакета. Ресурсы можно открывать или читать в двоичном или текстовом режиме.

Ресурсы примерно похожи на файлы внутри каталогов, хотя важно иметь в виду, что это просто метафор. Ресурсы и пакеты не должны существовать как физические файлы и каталоги в файловой системе.

Примечание

Этот модуль обеспечивает функциональные возможности, аналогичные pkg_resources Основной доступ к ресурсам, без накладных расходов на производительность этого пакета. Это упрощает чтение ресурсов, включенных в пакеты, с более стабильной и последовательной семантикой.

Автономный задний порт этого модуля предоставляет дополнительную информацию о использование importlib.resources и переход с pkg_resources на importlib.resources.

Загрузчики, которые хотят поддерживать считывание ресурсов, должны реализовывать метод get_resource_reader(fullname), как указано в параметре importlib.abc.ResourceReader.

Определены следующие типы.

importlib.resources.Package

Тип Package определяется как Union[str, ModuleType]. Это означает, что если функция описывает прием Package, можно передать либо строка, либо модуль. Объекты модуля должны иметь разрешимую __spec__.submodule_search_locations, которая не является None.

importlib.resources.Resource

Описывает имена ресурсов, переданные в различные функции этого пакета. Это определяется как Union[str, os.PathLike].

Доступны следующие функции.

importlib.resources.open_binary(package, resource)

Открыть для двоичного чтения resource в пределах package.

package является либо именем, либо объектом модуля, соответствующим требованиям Package. resource - название ресурса, который следует открыть в пределах package; он может не содержать разделителей путей и не иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает typing.BinaryIO сущность, двоичный I/O поток, открытый для чтения.

importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict')

Открыть для чтения текста resource в пределах package. По умолчанию ресурс открыт для чтения как UTF-8.

package является либо именем, либо объектом модуля, соответствующим требованиям Package. resource - название ресурса, который следует открыть в пределах package; он может не содержать разделителей путей и не иметь подресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и для встроенных open().

Эта функция возвращает typing.TextIO сущность, текст поток I/O, открытый для чтения.

importlib.resources.read_binary(package, resource)

Прочитайте и возвращает содержимое resource внутри package как bytes.

package является либо именем, либо объектом модуля, соответствующим требованиям Package. resource - название ресурса, который следует открыть в пределах package; он может не содержать разделителей путей и не иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает содержимое ресурса как bytes.

importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict')

Прочитайте и возвращает содержимое resource внутри package как str. По умолчанию содержимое считывается как строгое UTF-8.

package является либо именем, либо объектом модуля, соответствующим требованиям Package. resource - название ресурса, который следует открыть в пределах package; он может не содержать разделителей путей и не иметь подресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и для встроенных open(). Эта функция возвращает содержимое ресурса как str.

importlib.resources.path(package, resource)

Возвращает путь к resource в качестве фактического пути файловой системы. Эта функция возвращает диспетчер контекст для использования в with инструкция. Диспетчер контекст предоставляет объект pathlib.Path.

Переход из менеджера контекст очищает любой временный файл, созданный, когда ресурс должен быть извлечен из, например, zip-файл.

package является либо именем, либо объектом модуля, соответствующим требованиям Package. resource - название ресурса, который следует открыть в пределах package; он может не содержать разделителей путей и не иметь подресурсов (т.е. не может быть каталогом).

importlib.resources.is_resource(package, name)

Возвращает True если в пакете есть ресурс с именем name, в противном случае False. Помните, что каталоги - это not ресурсы! package является либо именем, либо объектом модуля, соответствующим требованиям Package.

importlib.resources.contents(package)

Возвращает итератор по именованным элементам в пакете. Итератор возвращает str ресурсы (например, файлы) и не ресурсы (например, каталоги). Итерабль не рекурсируется во вложенные каталоги.

package является либо именем, либо объектом модуля, соответствующим требованиям Package.

importlib.machinery – импортеры и путевые хуки

Исходный код: Lib/importlib/machinery.py


Этот модуль содержит различные объекты, которые помогают import найти и загрузить модули.

importlib.machinery.SOURCE_SUFFIXES

Список строки, представляющих распознаваемые суффиксы файлов для исходных модулей.

Добавлено в версии 3.3.

importlib.machinery.DEBUG_BYTECODE_SUFFIXES

Список строки, представляющих суффиксы файлов для неоптимизированных модулей байт-кодов.

Добавлено в версии 3.3.

Не рекомендуется, начиная с версии 3.5: Используйте BYTECODE_SUFFIXES вместо этого.

importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

Список строки, представляющих суффиксы файлов для оптимизированных модулей байт-кодов.

Добавлено в версии 3.3.

Не рекомендуется, начиная с версии 3.5: Используйте BYTECODE_SUFFIXES вместо этого.

importlib.machinery.BYTECODE_SUFFIXES

Список строки, представляющих распознаваемые суффиксы файлов для модулей байт-кодов (включая начальную точку).

Добавлено в версии 3.3.

Изменено в версии 3.5: Значение больше не зависит от __debug__.

importlib.machinery.EXTENSION_SUFFIXES

Список строки, представляющих распознаваемые суффиксы файлов для модулей расширений.

Добавлено в версии 3.3.

importlib.machinery.all_suffixes()

Возвращает комбинированный список строки, представляющих все суффиксы файлов для модулей, распознаваемых стандартным механизмом импорта. Это - помощник для код, который просто должен знать, относится ли путь файловой системы потенциально к модулю, не нуждаясь ни в каких деталях о виде модуля (например, inspect.getmodulename()).

Добавлено в версии 3.3.

class importlib.machinery.BuiltinImporter

Импортер для встроенных модулей. Все известные встроенные модули перечислены в разделе sys.builtin_module_names. Этот класс реализует importlib.abc.MetaPathFinder и importlib.abc.InspectLoader ABCs.

Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.

Изменено в версии 3.5: В рамках PEP 489 строящийся импортер сейчас реализует Loader.create_module() и Loader.exec_module()

class importlib.machinery.FrozenImporter

Импортер для замороженных модулей. Этот класс реализует importlib.abc.MetaPathFinder и importlib.abc.InspectLoader ABCs.

Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.

Изменено в версии 3.4: Приобретенные методы create_module() и exec_module().

class importlib.machinery.WindowsRegistryFinder

Поисковик для модулей, объявленных в реестре Windows. Этот класс реализует importlib.abc.MetaPathFinder ABC.

Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.

Добавлено в версии 3.3.

Не рекомендуется, начиная с версии 3.6: Вместо этого используйте конфигурацию site. Будущие версии Python могут не включать этот поиск по умолчанию.

class importlib.machinery.PathFinder

Поисковик для sys.path и пакет __path__ атрибуты. Этот класс реализует importlib.abc.MetaPathFinder ABC.

Только методы класса определяются этим классом для облегчения необходимости создания экземпляра.

classmethod find_spec(fullname, path=None, target=None)

Метод класса, который пытается найти спецификацию для модуля определенным fullname на sys.path или, если определено, на path. Для каждой записи пути, которая является найденный, устанавливается флажок sys.path_importer_cache. Если неложный объект найден тогда, это - используемый как поисковик пути, чтобы искать модуль, являющийся найденный для. Если никакой вход не найден в sys.path_importer_cache, то sys.path_hooks - найденный для искателя для входа пути и, если найдено, сохранен в sys.path_importer_cache наряду с тем, чтобы быть подвергнутым сомнению о модуле. Если поиск никогда не найден, то None хранится в кэш и возвращенный.

Добавлено в версии 3.4.

Изменено в версии 3.5: Если текущий рабочий каталог, представленный пустым строка, больше недействителен, то None является возвращенный, но ни один значение не кэшируется в sys.path_importer_cache.

classmethod find_module(fullname, path=None)

Устаревшая обертка вокруг find_spec().

Не рекомендуется, начиная с версии 3.4: Используйте find_spec() вместо этого.

classmethod invalidate_caches()

Вызывает importlib.abc.PathEntryFinder.invalidate_caches() для всех поисковиков, хранящихся в sys.path_importer_cache, которые определяют метод. Иначе записи в наборе sys.path_importer_cache к None удалены.

Изменено в версии 3.7: Записи None в sys.path_importer_cache удаляются.

Изменено в версии 3.4: Вызов объектов в sys.path_hooks с текущим рабочим каталогом для '' (т.е. пустым строка).

class importlib.machinery.FileFinder(path, *loader_details)

Конкретная реализация importlib.abc.PathEntryFinder, которые кэшируют результаты файловой системы.

Аргумент path - это каталог, для которого поисковик отвечает за поиск.

Аргумент loader_details представляет собой переменное число кортежей из 2 элементов, каждый из которых содержит загрузчик и последовательность суффиксов файлов, распознаваемых загрузчиком. Ожидается, что загрузчики будут вызываемыми, которые примут два аргумента имени модуля и пути к найденному файлу.

Искатель будет кэш директивное содержание по мере необходимости, делая призывы статистики к каждому поиску модуля, чтобы проверить, что кэш не устарел. Поскольку кэш staleness зависит от детализации состояние информации операционной системы о файловой системе, существует потенциальное условие гонки поиска модуля, создания нового файла, а затем поиска модуля, который представляет новый файл. Если операции выполняются достаточно быстро, чтобы соответствовать гранулярности статических вызовов, поиск модуля завершится неудачей. Чтобы не допустить этого, при динамическом создании модуля обязательно вызовите функцию importlib.invalidate_caches().

Добавлено в версии 3.3.

path

Путь, по которому будет выполняться поиск.

find_spec(fullname, target=None)

Попытайтесь найти, что spec обращается с fullname в path.

Добавлено в версии 3.4.

find_loader(fullname)

Попытка найти загрузчик для обработки fullname в пределах path.

invalidate_caches()

Очистить внутренний кэш.

classmethod path_hook(*loader_details)

Метод класса, возвращающий закрытие для использования на sys.path_hooks. сущность FileFinder - возвращенный закрытием, используя аргумент пути, данный закрытию непосредственно и loader_details косвенно.

Если аргумент закрытию не существующий справочник, ImportError поднят.

class importlib.machinery.SourceFileLoader(fullname, path)

Конкретное осуществление importlib.abc.SourceLoader путем подклассирования importlib.abc.FileLoader и обеспечения некоторых конкретных реализаций других методов.

Добавлено в версии 3.3.

name

Имя модуля, который будет обрабатываться этим загрузчиком.

path

Путь к исходному файлу.

is_package(fullname)

Возвращает True, если path относится к пакету.

path_stats(path)

Конкретное осуществление importlib.abc.SourceLoader.path_stats().

set_data(path, data)

Конкретное осуществление importlib.abc.SourceLoader.set_data().

load_module(name=None)

Конкретная реализация importlib.abc.Loader.load_module(), где указание имени загружаемого модуля является необязательным.

Не рекомендуется, начиная с версии 3.6: Используйте importlib.abc.Loader.exec_module() вместо этого.

class importlib.machinery.SourcelessFileLoader(fullname, path)

Конкретное внедрение importlib.abc.FileLoader, который может импортировать байткод файлы (т.е. никакой источник файлы код существуют).

Обратите внимание на то, что прямое использование байткод файлов (и таким образом не источник файлы код) запрещает вашим модулям то, чтобы быть применимым всеми внедрениями Python или новыми версиями Python, которые изменяют формат байткод.

Добавлено в версии 3.3.

name

Имя модуля, обрабатываемого загрузчиком.

path

Путь к файлу байт-кода.

is_package(fullname)

Определяет, является ли модуль пакетом на основе path.

get_code(fullname)

Возвращает объект код для 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, так как модули расширения не имеют источника код.

get_filename(fullname)

Возвращает path.

Добавлено в версии 3.4.

class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)

Спецификация для состояние, связанных с системой импорта модуля. Это, как правило, выставляется как __spec__ атрибут модуля. В описаниях ниже, имена в круглых скобках дают передачу, атрибут доступный непосредственно на объекте модуля. Например, module.__spec__.origin == module.__file__. Однако обратите внимание, что, хотя values обычно эквивалентны, они могут различаться, поскольку синхронизация между двумя объектами отсутствует. Таким образом, можно обновлять __path__ модуля во время выполнения, и это не будет автоматически отражаться в __spec__.submodule_search_locations.

Добавлено в версии 3.4.

name

(__name__)

строка для полного имени модуля.

loader

(__loader__)

Загрузчик, используемый для загрузки. Для пакетов пространства имен необходимо установить значение None.

origin

(__file__)

Имя места загрузки модуля, например, «builtin» для встроенных модулей и имя файла для модулей, загруженных из источника. Обычно «origin» должно быть установлено, но может быть None (по умолчанию), указывающее, что оно не определено (например, для пакетов пространства имен).

submodule_search_locations

(__path__)

Список строки для того, где найти подмодули, если пакет (None иначе).

loader_state

Контейнер дополнительных данных по модулю для использования во время загрузки (или None).

cached

(__cached__)

Строка для хранения скомпилированного модуля (или None).

parent

(__package__)

(Только для чтения) полное имя пакета, к которому принадлежит модуль, как подмодуль (или None).

has_location

Булево указание, относится ли «происхождение» модуля атрибут к загружаемому местоположению.

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 a optimization не None, то TypeError поднимается.

Добавлено в версии 3.4.

Изменено в версии 3.5: Параметр optimization добавлен, а параметр debug_override устарел.

Изменено в версии 3.6: Принимает путеподобный объект.

importlib.util.source_from_cache(path)

Учитывая path к имени файла PEP 3147, возвращает связанный источник путь к файлу код. Например, если path является /foo/bar/__pycache__/baz.cpython-32.pyc, путь возвращенный будет /foo/bar/baz.py. path не обязательно существовать, однако если он не соответствует формату PEP 3147 или PEP 488, возникает ValueError. Если значение sys.implementation.cache_tag не определено, значение NotImplementedError поднимается.

Добавлено в версии 3.4.

Изменено в версии 3.6: Принимает путеподобный объект.

importlib.util.decode_source(source_bytes)

Декодируйте заданные байты, представляющие источник код, и возвращает его как строка с универсальными новыми линиями (в соответствии с требованиями importlib.abc.InspectLoader.get_source()).

Добавлено в версии 3.4.

importlib.util.resolve_name(name, package)

Разрешает относительное имя модуля на абсолютное.

Если name не имеет начальных точек, то name просто возвращается. Это позволяет использовать такие, как importlib.util.resolve_name('sys', __package__) без выполнения проверьте, нужен ли аргумент package.

ValueError поднят, если name является относительным именем модуля, но пакет - ложный значение (например, None или пустой строка). ValueError также поднимается относительное имя будет выходить из содержащего его пакета (например, запрос ..bacon из пакета spam).

Добавлено в версии 3.3.

importlib.util.find_spec(name, package=None)

Найти спецификацию для модуля, возможно, относительно указанного имени package. Если модуль находится в sys.modules, то sys.modules[name].__spec__ - возвращенный (если spec не был бы None или не установлен, в этом случае ValueError поднят). Иначе поиск, используя sys.meta_path сделан. None является возвращенный, если spec не найден.

Если name предназначен для подмодуля (содержит точку), родительский модуль автоматически импортируется.

name and package работают так же, как и для import_module().

Добавлено в версии 3.4.

Изменено в версии 3.7: Повышает ModuleNotFoundError вместо AttributeError, если package на самом деле не является пакетом (т.е. не имеет __path__ атрибут).

importlib.util.module_from_spec(spec)

Создайте новый модуль на основе spec и spec.loader.create_module.

Если spec.loader.create_module не сделает возвращает None, то любое существование ранее атрибуты не будет перезагружено. Кроме того, не AttributeError будет поднят, если вызвано, получая доступ к spec или устанавливая атрибут на модуле.

Эта функция предпочтена по использованию types.ModuleType, чтобы создать новый модуль, поскольку spec является используемый, чтобы установить как можно больше управляемых импортом атрибуты на модуле.

Добавлено в версии 3.5.

@importlib.util.module_for_loader

декоратор для importlib.abc.Loader.load_module(), чтобы обращаться с выбором надлежащего модуля возражает, чтобы загрузить. У украшенного метода, как ожидают, будет требование сигнатура, берущий два позиционных аргумента (например, load_module(self, module)), для которого вторым аргументом будет модуль объект, чтобы быть используемый погрузчиком. Отметим, что декоратор не будет работать над статическими методами из-за предположения о двух аргументах.

Декорированный метод будет включать в себя имя модуля, загружаемого в соответствии с ожиданиями для загрузчика. Если модуль не найден в sys.modules, создается новый модуль. Независимо от того, где модуль прибыл из, набор __loader__ к self и __package__ установлен на основе того, что importlib.abc.InspectLoader.is_package() возвращает (при наличии). Эти атрибуты установлены безоговорочно для поддержки перезагрузки.

Если при использовании декорированного метода возникло исключение и модуль был добавлен в sys.modules, то модуль будет удален, чтобы предотвратить оставление частично инициализированного модуля в sys.modules. Если модуль уже был в sys.modules тогда, он оставлен в покое.

Изменено в версии 3.3: __loader__ и __package__ устанавливаются автоматически (по возможности).

Изменено в версии 3.4: Установите __name__, __loader__ __package__ безоговорочно для поддержки перезагрузки.

Не рекомендуется, начиная с версии 3.4: Механизм импорта теперь непосредственно выполняет все функциональные возможности, предоставляемые этой функцией.

@importlib.util.set_loader

Декоратор для importlib.abc.Loader.load_module(), чтобы установить __loader__ атрибут в модуле возвращенный. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обернутому методу (т.е. self) - то, во что должен быть установлен __loader__.

Изменено в версии 3.4: Установите __loader__, если установлено значение None, как если бы атрибут не существует.

Не рекомендуется, начиная с версии 3.4: Об этом автоматически заботится импортный механизм.

@importlib.util.set_package

Декоратор для importlib.abc.Loader.load_module(), чтобы установить __package__ атрибут в модуле возвращенный. Если параметр __package__ установлен и имеет значение, отличный от None, он не будет изменен.

Не рекомендуется, начиная с версии 3.4: Об этом автоматически заботится импортный механизм.

importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)

Заводская функция для создания ModuleSpec сущность на основе загрузчика. У параметров есть то же значение, как они делают для ModuleSpec. Функция использует доступные загрузчик API, такие как InspectLoader.is_package(), для заполнения недостающей информации о spec.

Добавлено в версии 3.4.

importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)

Фабричная функция для создания ModuleSpec сущность на основе пути к файлу. Недостающая информация будет заполнена на spec путем использования загрузчика API и подразумевая, что модуль будет основан на файле.

Добавлено в версии 3.4.

Изменено в версии 3.6: Принимает путеподобный объект.

importlib.util.source_hash(source_bytes)

Возвращает хэш source_bytes в байтах. Файл .pyc на основе хэша встраивает source_hash() содержимого соответствующего исходного файла в заголовок.

Добавлено в версии 3.7.

class importlib.util.LazyLoader(loader)

Классу, который откладывает выполнение погрузчика модуля до модуля, получили доступ к атрибут.

Этот класс только работает с загрузчиками, которые определяют exec_module() как контроль того, какой тип модуля является используемый для модуля. По тем тем же причинам метод погрузчика create_module() должен возвращает None или тип, для которого его __class__ атрибут может быть видоизменен наряду с не использованием slots. Наконец, модули, которые заменяют объект, помещенный в sys.modules, не будут работать, так как нет возможности правильно заменить ссылки модуля в течение всего интерпретатор; ValueError возникает при обнаружении такой замены.

Примечание

Для проектов с критическим временем запуска этот класс позволяет минимизировать затраты на загрузку модуля, если он никогда не будет используемый. Для проектов, где время запуска не важно тогда, использование этого класса - сильно, препятствовал из-за сообщений об ошибках, созданных во время погрузки быть отложенным и таким образом произойти из контекст.

Добавлено в версии 3.5.

Изменено в версии 3.6: Начал вызов create_module(), удалив предупреждение о совместимости для importlib.machinery.BuiltinImporter и importlib.machinery.ExtensionFileLoader.

classmethod factory(loader)

Статический метод, который возвращает вызываемый объект, который создает ленивый загрузчик. это предназначен для использования в ситуациях, когда загрузчик передается классом вместо экземпляра..:

suffixes = importlib.machinery.SOURCE_SUFFIXES
loader = importlib.machinery.SourceFileLoader
lazy_loader = importlib.util.LazyLoader.factory(loader)
finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))

Примеры

Программный импорт

Для программного импорта модуля используйте команду importlib.import_module():

import importlib

itertools = importlib.import_module('itertools')

Проверка возможности импорта модуля

Если необходимо выяснить, может ли модуль быть импортирован без выполнения импорта, следует использовать importlib.util.find_spec():

import importlib.util
import sys

# Для наглядности.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # Если вы решили выполнить фактический импорт ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

Импорт исходного файла непосредственно

Чтобы импортировать исходный файл Python непосредственно, используйте следующий рецепт (Python 3.5 и более новый только):

import importlib.util
import sys

# Для наглядности.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)

Настройка импортера

Для глубокой настройки импорта обычно требуется реализовать импортер. Это означает управление как поисковик, так и загрузчик стороной вещей. Для поисковиков есть два вкуса на выбор в зависимости от ваших потребностей: поисковик мета-пути или поисковик пути. Первый - то, что вы поставили бы sys.meta_path, в то время как последний - то, что вы создаете использование хук пути входа на sys.path_hooks, который работает с записями sys.path, чтобы потенциально создать искателя. В этом примере показано, как зарегистрировать собственных импортеров, чтобы импорт использовал их (для создания импортера для себя прочитайте документацию по соответствующим классам, определенным в этом пакете):

import importlib.machinery
import sys

# Для наглядности.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
                  importlib.machinery.SOURCE_SUFFIXES)

# Настройка мета пути поиска.
# Обязательно поместите поисковик в нужное место в списке с точки
# зрения приоритета.
sys.meta_path.append(SpamMetaPathFinder)

# Настройка средства поиска записей пути. Убедитесь, что хук пути расположен в
# списке в соответствии с приоритетом.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))

Приближение importlib.import_module()

Сам импорт реализуется в Python код, что позволяет выставить большую часть импортной техники через importlib. Следующее помогает проиллюстрировать различные API, которые importlib раскрывает, предоставляя приблизительную реализацию importlib.import_module() (Python 3.4 и более новые для использования importlib, Python 3.6 и более новые для других частей код)

import importlib.util
import sys

def import_module(name, package=None):
    """Примерная реализация импорта."""
    absolute_name = importlib.util.resolve_name(name, package)
    try:
        return sys.modules[absolute_name]
    except KeyError:
        pass

    path = None
    if '.' in absolute_name:
        parent_name, _, child_name = absolute_name.rpartition('.')
        parent_module = import_module(parent_name)
        path = parent_module.__spec__.submodule_search_locations
    for finder in sys.meta_path:
        spec = finder.find_spec(absolute_name, path)
        if spec is not None:
            break
    else:
        msg = f'No module named {absolute_name!r}'
        raise ModuleNotFoundError(msg, name=absolute_name)
    module = importlib.util.module_from_spec(spec)
    sys.modules[absolute_name] = module
    spec.loader.exec_module(module)
    if path is not None:
        setattr(parent_module, child_name, module)
    return module