pkgutil
— Утилита расширения пакета¶
Исходный код: Lib/pkgutil.py.
Этот модуль предоставляет утилиты для системы импорта, в частности, поддержку пакетов.
-
class
pkgutil.
ModuleInfo
(module_finder, name, ispkg)¶ Именованный кортеж, содержащий краткую информацию о модуле.
Добавлено в версии 3.6.
-
pkgutil.
extend_path
(path, name)¶ Расширяет путь поиска модулей, входящих в пакет. Предполагается использовать для размещения следующего кода в
__init__.py
пакета:from pkgutil import extend_path __path__ = extend_path(__path__, __name__)
Это добавит к
__path__
пакета все подкаталоги каталогов наsys.path
, названных именем пакета. Это полезно, если нужно распространить различные части одного логического пакета в виде нескольких каталогов.Он также ищет файлы
*.pkg
, начинающиеся там, где*
совпадает с аргументом name. Эта функция аналогична файлам*.pth
(см. модульsite
для получения дополнительной информации), за исключением того, что она не выделяет в особый регистр строки, начинающиеся сimport
. Файлу*.pkg
доверяют по номиналу: кроме проверки на дубликаты, все записи, найденные в файле*.pkg
, добавляются в путь, независимо от того, существуют ли они в файловой системе. (Это особенность.)Если входной путь не является списком (как в случае с замороженными пакетами), он возвращается без изменений. Входной путь не изменяется; возвращается расширенная копия. Элементы добавляются к копии только в конце.
Предполагается, что
sys.path
является последовательностью. Элементыsys.path
, которые не являются строками, ссылающимися на существующие каталоги, игнорируются. Элементы Юникода вsys.path
, которые вызывают ошибки при использовании в качестве имен файлов, могут вызвать исключение (в соответствии с поведениемos.path.isdir()
).
-
class
pkgutil.
ImpImporter
(dirname=None)¶ PEP 302 Поиск, который обертывает «классический» алгоритм импорта Python.
Если dirname - строка, создается поисковый модуль PEP 302, который ищет в этом каталоге. Если dirname равно
None
, создается искатель PEP 302, который ищет в текущем каталогеsys.path
, плюс все модули, которые заморожены или встроены.Обратите внимание, что
ImpImporter
в настоящее время не поддерживает использование при размещении наsys.meta_path
.
-
class
pkgutil.
ImpLoader
(fullname, file, filename, etc)¶ Loader, который обертывает «классический» алгоритм импорта Python.
-
pkgutil.
find_loader
(fullname)¶ Получение модуля loader для заданного fullname.
Это обертка для обратной совместимости с
importlib.util.find_spec()
, которая преобразует большинство сбоев вImportError
и возвращает только загрузчик, а не полныйModuleSpec
.Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на
importlib
, а не полагаться на внутреннюю эмуляцию импорта пакета PEP 302.Изменено в версии 3.4: Обновлено на основе PEP 451.
-
pkgutil.
get_importer
(path_item)¶ Получение finder для данного путь_элемента.
Возвращенный finder кэшируется в
sys.path_importer_cache
, если он был недавно создан крючком пути.Кэш (или его часть) может быть очищен вручную, если необходимо повторное сканирование
sys.path_hooks
.
-
pkgutil.
get_loader
(module_or_name)¶ Получить объект loader для module_or_name.
Если модуль или пакет доступен через обычный механизм импорта, возвращается обертка вокруг соответствующей части этого механизма. Возвращается
None
, если модуль не может быть найден или импортирован. Если именованный модуль еще не импортирован, импортируется содержащий его пакет (если таковой имеется), чтобы создать пакет__path__
.Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на
importlib
, а не полагаться на внутреннюю эмуляцию импорта пакета PEP 302.Изменено в версии 3.4: Обновлено на основе PEP 451.
-
pkgutil.
iter_importers
(fullname='')¶ Выдает finder объектов для заданного имени модуля.
Если fullname содержит
'.'
, поиск будет осуществляться для пакета, содержащего fullname, в противном случае это будут все зарегистрированные поисковые системы верхнего уровня (т.е. те, которые находятся как наsys.meta_path
, так и наsys.path_hooks
).Если именованный модуль находится в пакете, то этот пакет импортируется как побочный эффект вызова этой функции.
Если имя модуля не указано, производятся все поисковики верхнего уровня.
-
pkgutil.
iter_modules
(path=None, prefix='')¶ Выдает
ModuleInfo
для всех подмодулей на пути, или, если путь равенNone
, все модули верхнего уровня наsys.path
.path должен быть либо
None
, либо списком путей, по которым следует искать модули.prefix - это строка, которую нужно выводить перед именем каждого модуля при выводе.
Примечание
Работает только для finder, который определяет метод
iter_modules()
. Этот интерфейс является нестандартным, поэтому модуль также предоставляет реализации дляimportlib.machinery.FileFinder
иzipimport.zipimporter
.
-
pkgutil.
walk_packages
(path=None, prefix='', onerror=None)¶ Выдает
ModuleInfo
для всех модулей, рекурсивно лежащих на пути, или, если путь равенNone
, для всех доступных модулей.path должен быть либо
None
, либо списком путей, по которым следует искать модули.prefix - это строка, которую нужно выводить перед именем каждого модуля при выводе.
Обратите внимание, что эта функция должна импортировать все пакеты (не все модули!) на заданном пути, чтобы получить доступ к атрибуту
__path__
для поиска подмодулей.onerror - это функция, которая вызывается с одним аргументом (именем импортируемого пакета), если при попытке импортировать пакет возникает исключение. Если функция onerror не задана, то
ImportError
s перехватываются и игнорируются, а все остальные исключения распространяются, прекращая поиск.Примеры:
# list all modules python can access walk_packages() # list all submodules of ctypes walk_packages(ctypes.__path__, ctypes.__name__ + '.')
Примечание
Работает только для finder, который определяет метод
iter_modules()
. Этот интерфейс является нестандартным, поэтому модуль также предоставляет реализации дляimportlib.machinery.FileFinder
иzipimport.zipimporter
.
-
pkgutil.
get_data
(package, resource)¶ Получить ресурс из пакета.
Это обертка для API loader
get_data
. Аргумент package должен представлять собой имя пакета в стандартном формате модуля (foo.bar
). Аргумент resource должен быть в виде относительного имени файла, используя/
в качестве разделителя путей. Имя родительского каталога..
не допускается, также как и корневое имя (начинающееся с/
).Функция возвращает двоичную строку, которая является содержимым указанного ресурса.
Для пакетов, расположенных в файловой системе, которые уже были импортированы, это грубый эквивалент:
d = os.path.dirname(sys.modules[package].__file__) data = open(os.path.join(d, resource), 'rb').read()
Если пакет не может быть найден или загружен, или он использует loader, который не поддерживает
get_data
, то возвращаетсяNone
. В частности, loader для namespace packages не поддерживаетget_data
.
-
pkgutil.
resolve_name
(name)¶ Разрешить имя объекту.
Эта функциональность используется во многих местах стандартной библиотеки (см. bpo-12915) - и эквивалентная функциональность также присутствует в широко используемых сторонних пакетах, таких как setuptools, Django и Pyramid.
Ожидается, что name будет строкой в одном из следующих форматов, где W - сокращение для действительного идентификатора Python, а точка обозначает литеральную точку в этих псевдо-регексах:
W(.W)*
W(.W)*:(W(.W)*)?
Первая форма предназначена только для обратной совместимости. Она предполагает, что некоторая часть точечного имени является пакетом, а остальное - объектом где-то внутри этого пакета, возможно, вложенным в другие объекты. Поскольку место, где заканчивается пакет и начинается иерархия объектов, не может быть определено путем осмотра, повторные попытки импорта должны выполняться с использованием этой формы.
Во второй форме вызывающая сторона делает точку разделения четкой с помощью одного двоеточия: имя с точкой слева от двоеточия - это пакет, который нужно импортировать, а имя с точкой справа - это иерархия объектов внутри этого пакета. В этой форме требуется только один импорт. Если он заканчивается двоеточием, то возвращается объект модуля.
Функция возвращает объект (который может быть модулем) или вызывает одно из следующих исключений:
ValueError
– если name не имеет распознанного формата.ImportError
– если импорт не удался, когда он не должен был удаться.AttributeError
– Если произошел сбой при обходе иерархии объектов внутри импортированного пакета, чтобы добраться до нужного объекта.Добавлено в версии 3.9.