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

Исходный код: Lib/zipimport.py


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

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

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

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

См.также

Замечания по применению PKZIP
Документация по формату ZIP-файлов фила каца, создателя формата и алгоритмов используемый.
PEP 273 - Импорт модулей из Zip-архивов
Написанных Джеймсом К. Альстремом (James C. Ahlstrom), который также предоставил реализацию. Python 2.3 следует спецификации в PEP 273, но использует реализацию, написанную Just van Rossum, которая использует хуки импорта, описанные в 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'