Spec-Zone.ru › Python 3.9

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

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

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

Введение

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

Во-вторых, компоненты для реализации оператора 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)

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

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

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

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

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

importlib.invalidate_caches()

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

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

importlib.reload(module)

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

При выполнении reload():

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

Есть ряд других нюансов:

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

try:
    cache
except NameError:
    cache = {}

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

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

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

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

Изменено в версии 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. Этот АБК является подклассом 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__

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

  • __loader__

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

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

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

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

module_repr(module)

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

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

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

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

class importlib.abc.ResourceReader

Заменено на TraversableResources

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

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

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

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

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

abstractmethod open_resource(resource)

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

Если ресурс не найден, возникает FileNotFoundError.

abstractmethod resource_path(resource)

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

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

abstractmethod is_resource(name)

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

abstractmethod contents()

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

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

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

class importlib.abc.ResourceLoader

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

Устарел начиная с версии 3.7: Этот АБК устарел в пользу поддержки загрузки ресурсов через 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)

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

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

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

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

Аргумент данные может быть тем, что поддерживает функция compile() (т. е. строка или байты). Аргумент путь должен быть «путем», откуда происходит исходный код, что может быть абстрактной концепцией (например, расположение в файле 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() вместо этого.

END_OF_DOCUMENT_MARKER
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__.

END_OF_DOCUMENT_MARKER
class importlib.abc.Traversable

Объект с подмножеством методов pathlib.Path, подходящих для обхода каталогов и открытия файлов.

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

abstractmethod name()

Базовое имя этого объекта без каких-либо ссылок на родительские элементы.

abstractmethod iterdir()

Возвращает Traversable-объекты в self.

abstractmethod is_dir()

Возвращает True, если self является каталогом.

abstractmethod is_file()

Возвращает True, если self является файлом.

abstractmethod joinpath(child)

Возвращает дочерний Traversable-объект в self.

abstractmethod __truediv__(child)

Возвращает дочерний Traversable-объект в self.

abstractmethod open(mode='r', *args, **kwargs)

mode может быть ‘r’ или ‘rb’ для открытия как текстового или двоичного файла. Возвращает дескриптор для чтения (также как pathlib.Path.open).

При открытии как текстового файла, принимает параметры кодирования, такие как те, что принимаются io.TextIOWrapper.

read_bytes()

Чтение содержимого self в формате байтов.

read_text(encoding=None)

Чтение содержимого self в формате текста.

class importlib.abc.TraversableResources

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

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

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.files(package)

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

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

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

importlib.resources.as_file(traversable)

Учитывая объект importlib.resources.abc.Traversable , представляющий файл, обычно из importlib.resources.files(), возвращает менеджер контекста для использования в инструкции with. Менеджер контекста предоставляет объект pathlib.Path.

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

Используйте as_file , когда методы Traversable (read_text, и т. д.) недостаточны и требуется фактический файл в файловой системе.

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

importlib.resources.open_binary(package, resource)

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

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

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

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

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

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

importlib.resources.read_binary(package, resource)

Читает и возвращает содержимое ресурса resource внутри package в формате bytes.

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

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

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

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

importlib.resources.path(package, resource)

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

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

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

importlib.resources.is_resource(package, name)

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

importlib.resources.contents(package)

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

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

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

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

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

importlib.machinery.SOURCE_SUFFIXES

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

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

importlib.machinery.DEBUG_BYTECODE_SUFFIXES

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

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

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

importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

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

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

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

importlib.machinery.BYTECODE_SUFFIXES

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

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

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

importlib.machinery.EXTENSION_SUFFIXES

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

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

importlib.machinery.all_suffixes()

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

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

class importlib.machinery.BuiltinImporter

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

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

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

class importlib.machinery.FrozenImporter

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

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

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

class importlib.machinery.WindowsRegistryFinder

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

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

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

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

class importlib.machinery.PathFinder

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

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

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

Метод класса, пытающийся найти спецификацию модуля, указанного в fullname в sys.path или, если определено, в path. Для каждого пути, который ищется, проверяется sys.path_importer_cache. Если найден объект, отличный от false, то он используется как находитель по записи пути для поиска искомого модуля. Если ни одна запись не найдена в 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)

Попытка найти спецификацию для обработки 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.

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

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

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

name

(__name__)

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

loader

(__loader__)

Загрузчик Loader, который следует использовать при загрузке модуля. Finders всегда должны устанавливать это значение.

origin

(__file__)

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

submodule_search_locations

(__path__)

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

loader_state

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

cached

(__cached__)

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

parent

(__package__)

(Только для чтения) Полное имя пакета, под которым модуль должен загружаться как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов это то же самое, что __name__.

has_location

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

importlib.util – Служебный код для импортеров

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

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

importlib.util.MAGIC_NUMBER

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

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

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

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

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

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

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

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

Изменено в версии 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', __spec__.parent) без проверки необходимости аргумента package.

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

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

Изменено в версии 3.9: Для повышения согласованности с операторами импорта, вместо ValueError используется исключение ImportError для неверных попыток относительного импорта.

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

A декоратор для 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

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

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

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

@importlib.util.set_package

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

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

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

A factory function for creating a ModuleSpec instance based on a loader. The parameters have the same meaning as they do for ModuleSpec. The function uses available loader APIs, such as InspectLoader.is_package(), to fill in any missing information on the spec.

New in version 3.4.

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

A factory function for creating a ModuleSpec instance based on the path to a file. Missing information will be filled in on the spec by making use of loader APIs and by the implication that the module will be file-based.

New in version 3.4.

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

importlib.util.source_hash(source_bytes)

Return the hash of source_bytes as bytes. A hash-based .pyc file embeds the source_hash() of the corresponding source file’s contents in its header.

New in version 3.7.

class importlib.util.LazyLoader(loader)

A class which postpones the execution of the loader of a module until the module has an attribute accessed.

This class only works with loaders that define exec_module() as control over what module type is used for the module is required. For those same reasons, the loader’s create_module() method must return None or a type for which its __class__ attribute can be mutated along with not using слоты. Finally, modules which substitute the object placed into sys.modules will not work as there is no way to properly replace the module references throughout the interpreter safely; ValueError is raised if such a substitution is detected.

Примечание

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

New in version 3.5.

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

classmethod factory(loader)

A static method which returns a callable that creates a lazy loader. This is meant to be used in situations where the loader is passed by class instead of by instance.

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

Примеры

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

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

import importlib

itertools = importlib.import_module('itertools')

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

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

import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you chose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

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

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

import importlib.util
import sys

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

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

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

Для глубокой настройки импорта обычно необходимо реализовать импортер. Это означает управление как поисковиком, так и загрузчиком. Для поисковиков доступны два варианта в зависимости от ваших потребностей: мета-путевой поисковик или поисковик по элементам пути. Первый размещается на 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)
    sys.modules[absolute_name] = module
    spec.loader.exec_module(module)
    if path is not None:
        setattr(parent_module, child_name, module)
    return module

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

Spec-Zone.ru

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