zipimport — Импорт модулей из Zip-архивов


Данный модуль добавляет возможность импортировать Python модули (*.py, *.pyc) и пакеты из архивов формата ZIP. Обычно нет необходимости явно использовать модуль zipimport; он автоматически используется встроенным механизмом import для элементов sys.path, являющихся путями к ZIP-архивам.

Обычно sys.path представляет собой список имён каталогов в виде строк. Данный модуль также позволяет элементу sys.path быть строкой, именующей ZIP-архив. ZIP-архив может содержать структуру подкаталогов для поддержки импорта пакетов, а путь внутри архива можно указать для импорта только из подкаталога. Например, путь example.zip/lib/ будет импортироваться только из подкаталога lib/ внутри архива.

В ZIP-архиве могут быть любые файлы, но для импорта доступны только файлы .py и .pyc. ZIP-импорт динамических модулей (.pyd, .so) запрещен. Обратите внимание, что если архив содержит только .py файлы, Python не будет пытаться изменить архив, добавив соответствующий .pyc файл, а это означает, что если ZIP-архив не содержит файлов .pyc, импорт может быть довольно медленным.

Изменено в версии 3.8: Ранее не поддерживались ZIP-архивы с комментарием к архиву.

См.также

Примечание по применению PKZIP
Документация по формату файла ZIP от Фила Каца, создателя формата и используемых алгоритмов.
PEP 273 — Импорт модулей из Zip-архивов
Написано Джеймсом С. Алстромом, который также предоставил реализацию. Питон 2.3 следует спецификации в PEP 273, но использует реализацию, написанную Просто ван Россумом, который использует хуки импорта, описанные в PEP 302.
PEP 302 — Новые импортные хуки
PEP для добавления обработчиков импорта, которые помогают этому модулю работать.

Данный модуль определяет исключение:

exception zipimport.ZipImportError

Исключение, вызванное объектами zipimporter. Это подкласс ImportError, поэтому его также можно определить как ImportError.

Объекты zipimporter

zipimporter — это класс для импорта ZIP-файлов.

class zipimport.zipimporter(archivepath)

Создает новый экземпляр zipimporter. archivepath должен быть путём к ZIP- файлу или к определенному пути внутри ZIP-файла. Например, archivepath из foo/bar.zip/lib будет искать модули в каталоге lib внутри ZIP-файла foo/bar.zip (при условии, что он существует).

Вызывается ZipImportError, если archivepath не указывает на действительный ZIP-архив.

find_module(fullname[, path])

Ищет модуль, указанный fullname. fullname должно быть полным именем модуля (с точками). Он возвращает сам экземпляр zipimporter, если модуль найден, или None, если нет. Необязательный аргумент path игнорируется, — он используется для совместимости с протоколом импортера.

get_code(fullname)

Возвращает объект кода для указанного модуля. Вызывается ZipImportError, если модуль не может быть найден.

get_data(pathname)

Возвращает данные, связанные с pathname. Вызывается OSError, если файл не найден.

Изменено в версии 3.3: Раньше вызывался IOError вместо OSError.

get_filename(fullname)

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

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

get_source(fullname)

Возвращает исходный код для указанного модуля. Вызывается ZipImportError, если модуль не найден, возвращает None, если модуль есть в архиве, но для него нет источника.

is_package(fullname)

Возвращает True, если модуль, указанный fullname, является пакетом. Вызывается ZipImportError, если модуль не может быть найден.

load_module(fullname)

Загружает модуль, указанный в fullname. fullname должно быть полным именем модуля (с точками). Он возвращает импортированный модуль или вызывает ZipImportError, если он не найден.

archive

Имя ZIP-файла, связанного с импортером, без возможного вложенного пути.

prefix

Подпуть в ZIP-файле, в котором выполняется поиск модулей. Это пустая строка для объектов zipimporter, указывающих на корень ZIP-файла.

Атрибуты archive и prefix в сочетании с косой чертой равны исходному аргументу archivepath, переданному конструктору zipimporter.

Примеры

Вот пример импорта модуля из ZIP-архива — обратите внимание, что модуль zipimport не используется явно.

$ unzip -l example.zip
Archive:  example.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     8467  11-26-02 22:30   jwzthreading.py
 --------                   -------
     8467                   1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, 'example.zip')  # Добавить файл .zip в начало пути
>>> import jwzthreading
>>> jwzthreading.__file__
'example.zip/jwzthreading.py'