pkgutil.md
1> **Источник:** https://python-all.ru/3.8/library/pkgutil.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`pkgutil`](https://python-all.ru/3.8/library/pkgutil.html#module-pkgutil) – Утилита расширения пакетов89**Исходный код:** [Lib/pkgutil.py](https://python-all.ru/src/3.8/Lib/pkgutil.py)1011---1213Этот модуль предоставляет утилиты для системы импорта, в частности поддержку пакетов.1415#### `class pkgutil.ModuleInfo(module_finder, name, ispkg)`1617Namedtuple, содержащий краткую сводку информации о модуле.1819Новое в версии 3.6.2021#### `pkgutil.extend_path(path, name)`2223Расширяет путь поиска модулей, составляющих пакет. Предполагается, что следующий код будет помещён в `__init__.py` пакета:2425```python26from pkgutil import extend_path27__path__ = extend_path(__path__, __name__)28```2930Это добавит в `__path__` пакета все подкаталоги каталогов из `sys.path`, названные по имени пакета. Это полезно, если требуется распространять разные части одного логического пакета как несколько каталогов.3132Он также ищет файлы `*.pkg`, начиная с тех, где `*` соответствует аргументу *name*. Эта возможность аналогична файлам `*.pth` (см. модуль [`site`](https://python-all.ru/3.8/library/site.html#module-site) для получения дополнительной информации), за исключением того, что строки, начинающиеся с `import`, не обрабатываются особым образом. Файл `*.pkg` принимается без проверки: помимо проверки на дубликаты, все записи, найденные в файле `*.pkg`, добавляются в путь независимо от того, существуют ли они в файловой системе. (Это особенность.)3334Если входной путь не является списком (как в случае замороженных пакетов), он возвращается без изменений. Входной путь не модифицируется; возвращается расширенная копия. Элементы добавляются только в конец этой копии.3536Предполагается, что [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path) является последовательностью. Элементы [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path), которые не являются строками, ссылающимися на существующие каталоги, игнорируются. Элементы Unicode в [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path), вызывающие ошибки при использовании в качестве имён файлов, могут привести к возникновению исключения этой функцией (в соответствии с поведением [`os.path.isdir()`](https://python-all.ru/3.8/library/os.path.html#os.path.isdir)).3738#### `class pkgutil.ImpImporter(dirname=None)`3940[**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) поисковик, оборачивающий «классический» алгоритм импорта Python.4142Если *dirname* является строкой, создаётся [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) поисковик, который выполняет поиск в этом каталоге. Если *dirname* равен `None`, создаётся [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) поисковик, который ищет в текущем [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path), а также в любых замороженных или встроенных модулях.4344Обратите внимание, что [`ImpImporter`](https://python-all.ru/3.8/library/pkgutil.html#pkgutil.ImpImporter) в настоящее время не поддерживает использование путём размещения на [`sys.meta_path`](https://python-all.ru/3.8/library/sys.html#sys.meta_path).4546Deprecated since version 3.3: This emulation is no longer needed, as the standard import mechanism is now fully [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) compliant and available in [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib).4748#### `class pkgutil.ImpLoader(fullname, file, filename, etc)`4950[Loader](https://python-all.ru/3.8/glossary.html#term-loader) оборачивающий «классический» алгоритм импорта Python.5152Deprecated since version 3.3: This emulation is no longer needed, as the standard import mechanism is now fully [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) compliant and available in [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib).5354#### `pkgutil.find_loader(fullname)`5556Возвращает загрузчик модуля [loader](https://python-all.ru/3.8/glossary.html#term-loader) для указанного *fullname*.5758Это обёртка обратной совместимости для [`importlib.util.find_spec()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.find_spec), которая преобразует большинство ошибок в [`ImportError`](https://python-all.ru/3.8/library/exceptions.html#ImportError) и возвращает только загрузчик, а не полный `ModuleSpec`.5960Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) вместо использования внутренней эмуляции импорта [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) пакета.6162Изменено в версии 3.4: Обновлено для использования на основе [**PEP 451**](https://python-all.ru/3.8/library/pkgutil.html)6364#### `pkgutil.get_importer(path_item)`6566Возвращает объект [finder](https://python-all.ru/3.8/glossary.html#term-finder) для указанного *path\_item*.6768Возвращённый объект finder кэшируется в [`sys.path_importer_cache`](https://python-all.ru/3.8/library/sys.html#sys.path_importer_cache), если он был только что создан хуком пути.6970Кэш (или его часть) можно очистить вручную, если требуется повторное сканирование [`sys.path_hooks`](https://python-all.ru/3.8/library/sys.html#sys.path_hooks).7172Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) вместо использования внутренней эмуляции импорта [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) пакета.7374#### `pkgutil.get_loader(module_or_name)`7576Возвращает объект [загрузчика](https://python-all.ru/3.8/glossary.html#term-loader) для *module\_or\_name*.7778Если модуль или пакет доступен через обычный механизм импорта, возвращается обёртка вокруг соответствующей части этого механизма. Возвращает `None`, если модуль не найден или не может быть импортирован. Если указанный модуль ещё не импортирован, импортируется его содержащий пакет (если есть), чтобы установить `__path__` пакета.7980Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) вместо использования внутренней эмуляции импорта [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) пакета.8182Изменено в версии 3.4: Обновлено для использования на основе [**PEP 451**](https://python-all.ru/3.8/library/pkgutil.html)8384#### `pkgutil.iter_importers(fullname='')`8586Возвращает (как генератор) объекты [finder](https://python-all.ru/3.8/glossary.html#term-finder) для указанного имени модуля.8788Если fullname содержит точку, искатели будут предназначены для пакета, содержащего fullname; в противном случае – для всех зарегистрированных искателей верхнего уровня (т.е. тех, что находятся в sys.meta\_path и sys.path\_hooks).8990Если указанный модуль находится в пакете, этот пакет импортируется как побочный эффект вызова данной функции.9192Если имя модуля не указано, возвращаются все поисковики верхнего уровня.9394Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) вместо использования внутренней эмуляции импорта [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) пакета.9596#### `pkgutil.iter_modules(path=None, prefix='')`9798Возвращает [`ModuleInfo`](https://python-all.ru/3.8/library/pkgutil.html#pkgutil.ModuleInfo) для всех подмодулей в *path*, или, если *path* равно `None`, все модули верхнего уровня из `sys.path`.99100*path* должен быть либо `None`, либо списком путей для поиска модулей.101102*prefix* – это строка, которая выводится перед именем каждого модуля в выводе.103104> **Примечание**105>106> Работает только для [finder](https://python-all.ru/3.8/glossary.html#term-finder), который определяет метод `iter_modules()`. Этот интерфейс нестандартный, поэтому модуль также предоставляет реализации для [`importlib.machinery.FileFinder`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.FileFinder) и [`zipimport.zipimporter`](https://python-all.ru/3.8/library/zipimport.html#zipimport.zipimporter).107108Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) вместо использования внутренней эмуляции импорта [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) пакета.109110#### `pkgutil.walk_packages(path=None, prefix='', onerror=None)`111112Возвращает [`ModuleInfo`](https://python-all.ru/3.8/library/pkgutil.html#pkgutil.ModuleInfo) для всех модулей рекурсивно в *path*, или, если *path* равно `None`, всех доступных модулей.113114*path* должен быть либо `None`, либо списком путей для поиска модулей.115116*prefix* – это строка, которая выводится перед именем каждого модуля в выводе.117118Обратите внимание, что эта функция должна импортировать все *пакеты* (*не* все модули!) по заданному *пути*, чтобы получить доступ к атрибуту `__path__` для поиска подмодулей.119120*onerror* – это функция, которая вызывается с одним аргументом (именем пакета, который импортировался), если при попытке импортировать пакет возникает исключение. Если функция *onerror* не указана, то [`ImportError`](https://python-all.ru/3.8/library/exceptions.html#ImportError) перехватываются и игнорируются, а все остальные исключения распространяются, прекращая поиск.121122Примеры:123124```python125# вывести все модули, доступные Python126walk_packages()127128# вывести все подмодули ctypes129walk_packages(ctypes.__path__, ctypes.__name__ + '.')130```131132> **Примечание**133>134> Работает только для [finder](https://python-all.ru/3.8/glossary.html#term-finder), который определяет метод `iter_modules()`. Этот интерфейс нестандартный, поэтому модуль также предоставляет реализации для [`importlib.machinery.FileFinder`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.FileFinder) и [`zipimport.zipimporter`](https://python-all.ru/3.8/library/zipimport.html#zipimport.zipimporter).135136Изменено в версии 3.3: Обновлено, чтобы основываться непосредственно на [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) вместо использования внутренней эмуляции импорта [**PEP 302**](https://python-all.ru/3.8/library/pkgutil.html) пакета.137138#### `pkgutil.get_data(package, resource)`139140Получить ресурс из пакета.141142Это обёртка для API [загрузчика](https://python-all.ru/3.8/glossary.html#term-loader) [`get_data`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.ResourceLoader.get_data). Аргумент *package* должен быть именем пакета в стандартном формате модуля (`foo.bar`). Аргумент *resource* должен быть задан в виде относительного имени файла с использованием `/` в качестве разделителя путей. Имя родительского каталога `..` не допускается, так же как и имя с корнем (начинающееся с `/`).143144Функция возвращает двоичную строку, содержащую указанный ресурс.145146Для пакетов, расположенных в файловой системе, которые уже были импортированы, это приблизительный эквивалент следующего:147148```python149d = os.path.dirname(sys.modules[package].__file__)150data = open(os.path.join(d, resource), 'rb').read()151```152153Если пакет не удаётся найти или загрузить, или же он использует [загрузчик](https://python-all.ru/3.8/glossary.html#term-loader), который не поддерживает [`get_data`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.ResourceLoader.get_data), то возвращается `None`. В частности, [загрузчик](https://python-all.ru/3.8/glossary.html#term-loader) для [пакетов пространств имён](https://python-all.ru/3.8/glossary.html#term-namespace-package) не поддерживает [`get_data`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.ResourceLoader.get_data).154