pkgutil – Утилита расширения пакетов¶pkgutil – Package extension utility
Исходный код: Lib/pkgutil.py
Этот модуль предоставляет утилиты для системы импорта, в частности поддержку пакетов.
-
class
pkgutil.ModuleInfo(module_finder, name, ispkg)¶ Namedtuple, содержащий краткую сводку информации о модуле.
Новое в версии 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, которые не являются строками, ссылающимися на существующие каталоги, игнорируются. Элементы Unicode в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.Устарело с версии 3.3: Эта эмуляция больше не нужна, так как стандартный механизм импорта теперь полностью совместим с PEP 302 и доступен в
importlib.
-
class
pkgutil.ImpLoader(fullname, file, filename, etc)¶ Loader оборачивающий «классический» алгоритм импорта Python.
Устарело с версии 3.3: Эта эмуляция больше не нужна, так как стандартный механизм импорта теперь полностью совместим с PEP 302 и доступен в
importlib.
-
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 для указанного path_item.
Возвращённый объект finder кэшируется в
sys.path_importer_cache, если он был только что создан хуком пути.Кэш (или его часть) можно очистить вручную, если требуется повторное сканирование
sys.path_hooks.Изменено в версии 3.3: Обновлено для прямой работы на основе
importlibвместо использования внутренней эмуляции импорта PEP 302 пакета.
-
pkgutil.get_loader(module_or_name)¶ Возвращает объект загрузчика для 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).
Если указанный модуль находится в пакете, этот пакет импортируется как побочный эффект вызова данной функции.
Если имя модуля не указано, возвращаются все поисковики верхнего уровня.
Изменено в версии 3.3: Обновлено для прямой работы на основе
importlibвместо использования внутренней эмуляции импорта PEP 302 пакета.
-
pkgutil.iter_modules(path=None, prefix='')¶ Возвращает
ModuleInfoдля всех подмодулей в path, или, если path равноNone, все модули верхнего уровня изsys.path.path должен быть либо
None, либо списком путей для поиска модулей.prefix – это строка, которая выводится перед именем каждого модуля в выводе.
Примечание
Работает только для finder, который определяет метод
iter_modules(). Этот интерфейс нестандартный, поэтому модуль также предоставляет реализации дляimportlib.machinery.FileFinderиzipimport.zipimporter.Изменено в версии 3.3: Обновлено для прямой работы на основе
importlibвместо использования внутренней эмуляции импорта PEP 302 пакета.
-
pkgutil.walk_packages(path=None, prefix='', onerror=None)¶ Возвращает
ModuleInfoдля всех модулей рекурсивно в path, или, если path равноNone, всех доступных модулей.path должен быть либо
None, либо списком путей для поиска модулей.prefix – это строка, которая выводится перед именем каждого модуля в выводе.
Обратите внимание, что эта функция должна импортировать все пакеты (не все модули!) по заданному пути, чтобы получить доступ к атрибуту
__path__для поиска подмодулей.onerror – это функция, которая вызывается с одним аргументом (именем пакета, который импортировался), если при попытке импортировать пакет возникает исключение. Если функция onerror не указана, то
ImportErrorперехватываются и игнорируются, а все остальные исключения распространяются, прекращая поиск.Примеры:
# вывести все модули, доступные Python walk_packages() # вывести все подмодули ctypes walk_packages(ctypes.__path__, ctypes.__name__ + '.')
Примечание
Работает только для finder, который определяет метод
iter_modules(). Этот интерфейс нестандартный, поэтому модуль также предоставляет реализации дляimportlib.machinery.FileFinderиzipimport.zipimporter.Изменено в версии 3.3: Обновлено для прямой работы на основе
importlibвместо использования внутренней эмуляции импорта PEP 302 пакета.
-
pkgutil.get_data(package, resource)¶ Получить ресурс из пакета.
Это обёртка для API загрузчика
get_data. Аргумент package должен быть именем пакета в стандартном формате модуля (foo.bar). Аргумент resource должен быть задан в виде относительного имени файла с использованием/в качестве разделителя путей. Имя родительского каталога..не допускается, так же как и имя с корнем (начинающееся с/).Функция возвращает двоичную строку, содержащую указанный ресурс.
Для пакетов, расположенных в файловой системе, которые уже были импортированы, это приблизительный эквивалент следующего:
d = os.path.dirname(sys.modules[package].__file__) data = open(os.path.join(d, resource), 'rb').read()
Если пакет не удаётся найти или загрузить, или же он использует загрузчик, который не поддерживает
get_data, то возвращаетсяNone. В частности, загрузчик для пакетов пространств имён не поддерживаетget_data.