Spec-Zone.ru › Python 3.7

importlib — Реализация импорта

Новое в версии 3.1.

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

Введение

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

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

См. также

Оператор import

Ссылка на язык для оператора import.

Спецификация пакетов

Исходная спецификация пакетов. Некоторые семантики изменились с момента написания этого документа (например, перенаправление на основе None в sys.modules).

The __import__() function

Оператор import является синтаксическим сахаром для этой функции.

PEP 235

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

PEP 263

Определение кодировок исходного кода Python

PEP 302

Новые крючки для импорта

PEP 328

Импорт: многострочные и абсолютные/относительные

PEP 366

Явные относительные импорты модуля main

PEP 420

Неявные пакеты именованных пространств

PEP 451

Тип ModuleSpec для системы импорта

PEP 488

Исключение файлов PYO

PEP 489

Многофазная инициализация модулей расширения

PEP 552

Детерминированные pycs

PEP 3120

Использование UTF-8 в качестве кодировки по умолчанию для исходного кода

PEP 3147

Директории репозитория PYC

Функции

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

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

Примечание

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

importlib.import_module(name, package=None)

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

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

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

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

importlib.find_loader(name, path=None)

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

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

Новое в версии 3.3.

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

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

importlib.invalidate_caches()

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

Новое в версии 3.3.

END_OF_DOCUMENT_MARKER
importlib.reload(module)

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

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

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

Есть ряд других замечаний:

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

try:
    cache
except NameError:
    cache = {}

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

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

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

Новая функция в версии 3.4.

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

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

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

Модуль importlib.abc содержит все основные абстрактные базовые классы, используемые для import. Некоторые подклассы основных абстрактных базовых классов также предоставляются для помощи в реализации основных АБК.

Иерархия АБК:

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

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

Устарело с версии 3.3: Используйте MetaPathFinder или PathEntryFinder вместо этого.

abstractmethod find_module(fullname, path=None)

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

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

class importlib.abc.MetaPathFinder

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

Новая функция в версии 3.3.

find_spec(fullname, path, target=None)

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

Новая функция в версии 3.4.

find_module(fullname, path)

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

Если find_spec() определён, обеспечивается обратная совместимость.

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

Устарело с версии 3.4: Используйте find_spec() вместо этого.

invalidate_caches()

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

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

class importlib.abc.PathEntryFinder

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

Введено в версии 3.3.

find_spec(fullname, target=None)

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

Введено в версии 3.4.

find_loader(fullname)

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

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

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

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

find_module(fullname)

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

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

invalidate_caches()

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

class importlib.abc.Loader

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

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

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

create_module(spec)

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

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

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

exec_module(module)

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

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

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

load_module(fullname)

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

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

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

  • __name__

    Имя модуля.

  • __file__

    Путь к месту хранения данных модуля (не задаётся для встроенных модулей).

  • __cached__

    Путь к месту хранения скомпилированной версии модуля (не задаётся, когда атрибут не подходит).

  • __path__

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

  • __package__

    Родительский пакет для модуля/пакета. Если модуль находится на верхнем уровне, его значение равно пустой строке. Декоратор importlib.util.module_for_loader() может обрабатывать детали для __package__.

  • __loader__

    Загрузчик, использованный для загрузки модуля. Декоратор importlib.util.module_for_loader() может обрабатывать детали для __package__.

Когда exec_module() доступен, предоставляется обратная совместимость.

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

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

module_repr(module)

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

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

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

Устарело начиная с версии 3.4: Система импорта теперь обрабатывает это автоматически.

class importlib.abc.ResourceReader

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

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

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

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

Введено в версии 3.7.

abstractmethod open_resource(resource)

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

Если ресурс не найден, генерируется FileNotFoundError.

abstractmethod resource_path(resource)

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

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

abstractmethod is_resource(name)

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

abstractmethod contents()

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

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

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

class importlib.abc.ResourceLoader

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

Устарел начиная с версии 3.7: Этот АБК устарел в пользу поддержки загрузки ресурсов через importlib.abc.ResourceReader.

abstractmethod get_data(path)

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

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

class importlib.abc.InspectLoader

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

get_code(fullname)

Возвращает объект кода для модуля или None, если модуль не имеет объекта кода (как это бывает, например, для встроенного модуля). Генерирует ImportError, если загрузчик не может найти запрашиваемый модуль.

Примечание

Хотя метод имеет реализацию по умолчанию, рекомендуется переопределять его, если это возможно, для повышения производительности.

Изменено в версии 3.4: Перестал быть абстрактным и предоставляет конкретную реализацию.

abstractmethod get_source(fullname)

Абстрактный метод для возвращения исходного кода модуля. Он возвращается в виде текстовой строки с использованием универсальных символов новой строки, преобразуя все распознанные разделители строк в символы '\n'. Возвращает None, если исходный код недоступен (например, для встроенного модуля). Генерирует ImportError, если загрузчик не может найти указанный модуль.

Изменено в версии 3.4: Генерирует ImportError вместо NotImplementedError.

is_package(fullname)

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

Изменено в версии 3.4: Генерирует ImportError вместо NotImplementedError.

static source_to_code(data, path='<string>')

Создаёт объект кода из исходного кода Python.

Аргумент data может быть любым, который поддерживает функция compile() (т.е. строка или байты). Аргумент path должен быть «путем», от которого происходит исходный код, что может быть абстрактной концепцией (например, расположение в файле zip).

С последующим объектом кода можно выполнить его в модуле, выполнив exec(code, module.__dict__).

Введено в версии 3.4.

Изменено в версии 3.5: Метод стал статическим.

exec_module(module)

Реализация Loader.exec_module().

Введено в версии 3.4.

load_module(fullname)

Реализация Loader.load_module().

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

class importlib.abc.ExecutionLoader

Абстрактный базовый класс, наследуемый от InspectLoader, который, при реализации, помогает модулю выполняться как сценарий. ABC представляет необязательный протокол PEP 302.

abstractmethod get_filename(fullname)

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

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

Изменено в версии 3.4: Поднимает исключение ImportError вместо NotImplementedError.

class importlib.abc.FileLoader(fullname, path)

Абстрактный базовый класс, наследуемый от ResourceLoader и ExecutionLoader, предоставляющий конкретные реализации методов ResourceLoader.get_data() и ExecutionLoader.get_filename().

Аргумент fullname — полностью разрешённое имя модуля, который должен обрабатываться загрузчиком. Аргумент path — путь к файлу модуля.

Введено в версии 3.3.

name

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

path

Путь к файлу модуля.

load_module(fullname)

Вызывает load_module() родительского класса.

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

abstractmethod get_filename(fullname)

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

abstractmethod get_data(path)

Читает path как бинарный файл и возвращает его содержимое в байтах.

class importlib.abc.SourceLoader

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

  • ResourceLoader.get_data()
  • ExecutionLoader.get_filename()

    Должен возвращать только путь к исходному файлу; загрузка без исходного кода не поддерживается.

Абстрактные методы, определённые этим классом, предназначены для добавления необязательной поддержки байткодовых файлов. Не реализация этих необязательных методов (или их вызов, приводящий к исключению NotImplementedError) приводит к работе загрузчика только с исходным кодом. Реализация методов позволяет загрузчику работать с исходным и байткодовыми файлами; она не поддерживает загрузку без исходного кода, когда предоставляется только байткод. Байткодовые файлы являются оптимизацией для ускорения загрузки, удаляя этап парсинга компилятором Python, и поэтому нет API, специфичного для байткода.

path_stats(path)

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

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

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

Введено в версии 3.3.

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

path_mtime(path)

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

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

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

set_data(path, data)

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

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

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

get_code(fullname)

Конкретная реализация InspectLoader.get_code().

exec_module(module)

Конкретная реализация Loader.exec_module().

Введено в версии 3.4.

load_module(fullname)

Конкретная реализация Loader.load_module().

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

get_source(fullname)

Конкретная реализация InspectLoader.get_source().

is_package(fullname)

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

importlib.resources – Ресурсы

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

Введено в версии 3.7.

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

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

Примечание

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

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

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

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

importlib.resources.Package

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

importlib.resources.Resource

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

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

importlib.resources.open_binary(package, resource)

Открыть для двоичного чтения ресурс в пакете.

Пакет — это имя или объект модуля, который соответствует требованиям Package. Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом). Эта функция возвращает экземпляр typing.BinaryIO, двоичный поток ввода-вывода, открытый для чтения.

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

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

Пакет — это имя или объект модуля, который соответствует требованиям Package. Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом). encoding и errors имеют такое же значение, как и при использовании встроенной функции open().

Эта функция возвращает экземпляр typing.TextIO, текстовый поток ввода-вывода, открытый для чтения.

importlib.resources.read_binary(package, resource)

Прочитать и вернуть содержимое ресурса в пакете как bytes.

Пакет — это имя или объект модуля, который соответствует требованиям Package. Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом). Эта функция возвращает содержимое ресурса как bytes.

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

Прочитать и вернуть содержимое ресурса в пакете как str. По умолчанию содержимое читается как строгий UTF-8.

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

importlib.resources.path(package, resource)

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

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

Пакет — это имя или объект модуля, который соответствует требованиям Package.

Ресурс — это имя ресурса для открытия в пакете; он не может содержать разделители путей и не может иметь подресурсы (т.е. не может быть каталогом).
importlib.resources.is_resource(package, name)

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

importlib.resources.contents(package)

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

Пакет — это имя или объект модуля, который соответствует требованиям Package.

importlib.machinery – Загрузчики и хуки путей

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

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

importlib.machinery.SOURCE_SUFFIXES

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

Введено в версии 3.3.

importlib.machinery.DEBUG_BYTECODE_SUFFIXES

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

Введено в версии 3.3.

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

importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

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

Введено в версии 3.3.

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

importlib.machinery.BYTECODE_SUFFIXES

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

Введено в версии 3.3.

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

importlib.machinery.EXTENSION_SUFFIXES

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

Введено в версии 3.3.

importlib.machinery.all_suffixes()

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

Введено в версии 3.3.

class importlib.machinery.BuiltinImporter

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

Этот класс определяет только методы класса, чтобы избежать необходимости в создании экземпляров.

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

END_OF_DOCUMENT_MARKER
class importlib.machinery.FrozenImporter

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

В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.

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

class importlib.machinery.WindowsRegistryFinder

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

В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.

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

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

class importlib.machinery.PathFinder

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

В этом классе определены только методы класса, чтобы избежать необходимости в создании экземпляра.

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

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

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

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

classmethod find_module(fullname, path=None)

Обёртка предыдущей версии для find_spec().

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

classmethod invalidate_caches()

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

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

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

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

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

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

Аргумент loader_details — это переменное количество кортежей из двух элементов, каждый из которых содержит импортер и последовательность расширений файлов, распознаваемых импортером. Импортеры должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.

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

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

path

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

find_spec(fullname, target=None)

Попытка найти описание (spec) для обработки fullname в path.

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

find_loader(fullname)

Попытка найти импортер для обработки fullname в path.

invalidate_caches()

Очистка внутреннего кэша.

classmethod path_hook(*loader_details)

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

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

class importlib.machinery.SourceFileLoader(fullname, path)

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

Введено в версии 3.3.

name

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

path

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

is_package(fullname)

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

path_stats(path)

Конкретная реализация importlib.abc.SourceLoader.path_stats().

set_data(path, data)

Конкретная реализация importlib.abc.SourceLoader.set_data().

load_module(name=None)

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

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

class importlib.machinery.SourcelessFileLoader(fullname, path)

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

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

Введено в версии 3.3.

name

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

path

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

is_package(fullname)

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

get_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__. Однако следует иметь в виду, что, хотя значения обычно эквивалентны, они могут отличаться, так как между двумя объектами нет синхронизации. Таким образом, вы можете обновить атрибут модуля __path__ во время выполнения, и это не будет автоматически отражено в __spec__.submodule_search_locations.

Введено в версии 3.4.

name

(__name__)

Строка с полным квалифицированным именем модуля.

loader

(__loader__)

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

origin

(__file__)

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

submodule_search_locations

(__path__)

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

loader_state

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

cached

(__cached__)

Строка, обозначающая место хранения скомпилированного модуля (или None).

parent

(__package__)

(Только для чтения) Полное квалифицированное имя пакета, к которому относится модуль как подмодуль (или None).

has_location

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

importlib.util – Утилиты для импортёров

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

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

importlib.util.MAGIC_NUMBER

Байты, представляющие номер версии байткода. Если вам нужна помощь с загрузкой/записью байткода, обратитесь к importlib.abc.SourceLoader.

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

importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)

Возвращает путь PEP 3147/PEP 488 к файлу с байткодом, связанному с исходным путём path. Например, если path равен /foo/bar/baz.py, возвращаемое значение будет /foo/bar/__pycache__/baz.cpython-32.pyc для Python 3.2. Строка cpython-32 взята из текущего магического тега (см. get_tag(); если sys.implementation.cache_tag не определено, будет поднята ошибка NotImplementedError).

Параметр optimization используется для указания уровня оптимизации файла байткода. Пустая строка означает отсутствие оптимизации, поэтому /foo/bar/baz.py с optimization равным '' приведет к пути байткода /foo/bar/__pycache__/baz.cpython-32.pyc. None вызывает использование уровня оптимизации интерпретатора. Для любого другого значения используется строковое представление, поэтому /foo/bar/baz.py с optimization равным 2 приведёт к пути байткода /foo/bar/__pycache__/baz.cpython-32.opt-2.pyc. Строковое представление optimization может содержать только буквенно-цифровые символы, иначе будет поднята ошибка ValueError.

Параметр debug_override устарел и может использоваться для переопределения системного значения для __debug__. Значение True эквивалентно установке optimization в пустую строку. Значение False эквивалентно установке optimization в 1. Если ни debug_override, ни optimization не заданы, то будет поднята ошибка TypeError.

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

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

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

importlib.util.source_from_cache(path)

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

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

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

importlib.util.decode_source(source_bytes)

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

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

importlib.util.resolve_name(name, package)

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

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

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

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

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

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

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

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

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

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

importlib.util.module_from_spec(spec)

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

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

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

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

END_OF_DOCUMENT_MARKER
@importlib.util.module_for_loader

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

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

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

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

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

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

@importlib.util.set_loader

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

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

Устарело начиная с версии 3.4: Механизм импорта заботится об этом автоматически.

@importlib.util.set_package

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

Устарело начиная с версии 3.4: Механизм импорта заботится об этом автоматически.

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

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

Новая в версии 3.4.

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

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

Новая в версии 3.4.

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

importlib.util.source_hash(source_bytes)

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

Новая в версии 3.7.

class importlib.util.LazyLoader(loader)

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

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

Примечание

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

Новая в версии 3.5.

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

classmethod factory(loader)

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

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

Примеры

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

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

import importlib

itertools = importlib.import_module('itertools')

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

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

import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

spec = importlib.util.find_spec(name)
if spec is None:
    print("can't find the itertools module")
else:
    # If you chose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    # Adding the module to sys.modules is optional.
    sys.modules[name] = module

Прямой импорт исходного файла

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

import importlib.util
import sys

# For illustrative purposes.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Optional; only necessary if you want to be able to import the module
# by name later.
sys.modules[module_name] = module

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

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

import importlib.machinery
import sys

# For illustrative purposes only.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
                  importlib.machinery.SOURCE_SUFFIXES)

# Setting up a meta path finder.
# Make sure to put the finder in the proper location in the list in terms of
# priority.
sys.meta_path.append(SpamMetaPathFinder)

# Setting up a path entry finder.
# Make sure to put the path hook in the proper location in the list in terms
# of priority.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))

Приближенная реализация importlib.import_module()

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

import importlib.util
import sys

def import_module(name, package=None):
    """An approximate implementation of import."""
    absolute_name = importlib.util.resolve_name(name, package)
    try:
        return sys.modules[absolute_name]
    except KeyError:
        pass

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

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/importlib.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API