Документация Python неофициальный перевод

zipimport.md

141 строк · 10.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.14/library/zipimport.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `zipimport` – Импорт модулей из Zip-архивов89**Исходный код:** [Lib/zipimport.py](https://python-all.ru/src/3.14/Lib/zipimport.py)1011---1213Этот модуль добавляет возможность импортировать модули Python (`*.py`, `*.pyc`) и пакеты из архивов формата ZIP. Обычно нет необходимости использовать модуль `zipimport` явно; он автоматически используется встроенным механизмом [`import`](https://python-all.ru/3.14/reference/simple_stmts.html#import) для элементов [`sys.path`](https://python-all.ru/3.14/library/sys.html#sys.path), являющихся путями к ZIP-архивам.1415Обычно [`sys.path`](https://python-all.ru/3.14/library/sys.html#sys.path) – это список имён каталогов в виде строк. Этот модуль также позволяет элементу `sys.path` быть строкой, именующей ZIP-архив. ZIP-архив может содержать структуру подкаталогов для поддержки импорта пакетов, и можно указать путь внутри архива для импорта только из подкаталога. Например, путь `example.zip/lib/` будет импортировать только из подкаталога `lib/` внутри архива.1617В ZIP-архиве могут присутствовать любые файлы, но импортёры вызываются только для файлов `.py` и `.pyc`. Импорт динамических модулей из ZIP (`.pyd`, `.so`) запрещён. Обратите внимание, что если архив содержит только `.py` файлы, Python не будет пытаться изменить архив, добавляя соответствующий файл `.pyc`, то есть если ZIP-архив не содержит файлов `.pyc`, импорт может быть довольно медленным.1819Изменено в версии 3.13: ZIP64 поддерживается2021Изменено в версии 3.8: Ранее ZIP-архивы с комментарием архива не поддерживались.2223> **См. также**24>25> **[Примечание по применению PKZIP](https://python-all.ru/3.14/library/zipimport.html)**26>27> Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.28>29> **[**PEP 273**](https://python-all.ru/3.14/library/zipimport.html) – Импорт модулей из Zip-архивов**30>31> Автор Джеймс С. Альстрём, который также предоставил реализацию. Python 2.3 следует спецификации из [**PEP 273**](https://python-all.ru/3.14/library/zipimport.html), но использует реализацию, написанную Юстом ван Россумом, который использует хуки импорта, описанные в [**PEP 302**](https://python-all.ru/3.14/library/zipimport.html).32>33> **[`importlib`](https://python-all.ru/3.14/library/importlib.html#module-importlib) – Реализация механизма импорта**34>35> Пакет, предоставляющий соответствующие протоколы для реализации всеми импортёрами.3637Этот модуль определяет исключение:3839#### `exception zipimport.ZipImportError`4041Исключение, вызываемое объектами zipimporter. Оно является подклассом [`ImportError`](https://python-all.ru/3.14/library/exceptions.html#ImportError), поэтому его можно перехватывать также как `ImportError`.4243## Объекты zipimporter4445[`zipimporter`](https://python-all.ru/3.14/library/zipimport.html#zipimport.zipimporter) – это класс для импорта ZIP-файлов.4647#### `class zipimport.zipimporter(archivepath)`4849Создаёт новый экземпляр zipimporter. *archivepath* должен быть путём к ZIP-файлу или к конкретному пути внутри ZIP-файла. Например, *archivepath* со значением `foo/bar.zip/lib` будет искать модули в каталоге `lib` внутри ZIP-файла `foo/bar.zip` (при условии, что он существует).5051[`ZipImportError`](https://python-all.ru/3.14/library/zipimport.html#zipimport.ZipImportError) возбуждается, если *archivepath* не указывает на валидный ZIP-архив.5253Изменено в версии 3.12: Методы `find_loader()` и `find_module()`, устаревшие в 3.10, теперь удалены. Используйте [`find_spec()`](https://python-all.ru/3.14/library/zipimport.html#zipimport.zipimporter.find_spec) вместо них.5455#### `create_module(spec)`5657Реализация [`importlib.abc.Loader.create_module()`](https://python-all.ru/3.14/library/importlib.html#importlib.abc.Loader.create_module), которая возвращает [`None`](https://python-all.ru/3.14/library/constants.html#None) для явного запроса семантики по умолчанию.5859Добавлено в версии 3.10.6061#### `exec_module(module)`6263Реализация [`importlib.abc.Loader.exec_module()`](https://python-all.ru/3.14/library/importlib.html#importlib.abc.Loader.exec_module).6465Добавлено в версии 3.10.6667#### `find_spec(fullname, target=None)`6869Реализация [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.14/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).7071Добавлено в версии 3.10.7273#### `get_code(fullname)`7475Возвращает объект кода для указанного модуля. Возбуждает [`ZipImportError`](https://python-all.ru/3.14/library/zipimport.html#zipimport.ZipImportError), если модуль не удалось импортировать.7677#### `get_data(pathname)`7879Возвращает данные, связанные с *pathname*. Возбуждает [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError), если файл не найден.8081Изменено в версии 3.3: [`IOError`](https://python-all.ru/3.14/library/exceptions.html#IOError) раньше возбуждалось, теперь это псевдоним [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError).8283#### `get_filename(fullname)`8485Возвращает значение, которое было бы установлено для `__file__`, если бы указанный модуль был импортирован. Вызывает [`ZipImportError`](https://python-all.ru/3.14/library/zipimport.html#zipimport.ZipImportError), если модуль не удалось импортировать.8687Добавлено в версии 3.1.8889#### `get_source(fullname)`9091Возвращает исходный код указанного модуля. Вызывает [`ZipImportError`](https://python-all.ru/3.14/library/zipimport.html#zipimport.ZipImportError), если модуль не найден, возвращает [`None`](https://python-all.ru/3.14/library/constants.html#None), если архив содержит модуль, но без исходного кода.9293#### `is_package(fullname)`9495Возвращает `True`, если модуль, указанный в *fullname*, является пакетом. Вызывает [`ZipImportError`](https://python-all.ru/3.14/library/zipimport.html#zipimport.ZipImportError), если модуль не найден.9697#### `load_module(fullname)`9899Загружает модуль, указанный в *fullname*. *fullname* должен быть полным (точечным) именем модуля. В случае успеха возвращает импортированный модуль, в случае неудачи вызывает [`ZipImportError`](https://python-all.ru/3.14/library/zipimport.html#zipimport.ZipImportError).100101Устарело с версии 3.10, будет удалено в версии 3.15: Используйте [`exec_module()`](https://python-all.ru/3.14/library/zipimport.html#zipimport.zipimporter.exec_module) вместо этого.102103#### `invalidate_caches()`104105Очищает внутренний кеш информации о файлах, найденных в ZIP-архиве.106107Добавлено в версии 3.10.108109#### `archive`110111Имя файла ZIP-архива, связанного с импортёром, без возможного подпути.112113#### `prefix`114115Подпуть внутри ZIP-файла, где ищутся модули. Для объектов zipimporter, указывающих на корень ZIP-файла, это пустая строка.116117Атрибуты [`archive`](https://python-all.ru/3.14/library/zipimport.html#zipimport.zipimporter.archive) и [`prefix`](https://python-all.ru/3.14/library/zipimport.html#zipimport.zipimporter.prefix), если их объединить через косую черту, равны исходному аргументу *archivepath*, переданному конструктору `zipimporter`.118119## Примеры120121Вот пример импорта модуля из ZIP-архива – обратите внимание, что модуль `zipimport` явно не используется.122123```console124$ unzip -l example_archive.zip125Archive:  example_archive.zip126  Length     Date   Time    Name127 --------    ----   ----    ----128     8467  01-01-00 12:30   example.py129 --------                   -------130     8467                   1 file131```132133```pycon134>>> import sys135>>> # Добавляет архив в начало пути поиска модулей.136>>> sys.path.insert(0, 'example_archive.zip')137>>> import example138>>> example.__file__139'example_archive.zip/example.py'140```141