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.13: Поддерживается ZIP64

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

См.также

PKZIP Application Note

Документация по формату файлов ZIP от Фила Каца, создателя формата и используемых алгоритмов.

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

Написана Джеймсом К. Алстромом, который также предоставил реализацию. Python 2.3 следует спецификации в PEP 273, но использует реализацию, написанную Джастом ван Россумом, которая использует крючки импорта, описанные в PEP 302.

importlib - Реализация механизма импорта

Пакет, содержащий соответствующие протоколы для всех импортеров.

Этот модуль определяет исключение:

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-архив.

Изменено в версии 3.12: Методы find_loader() и find_module(), устаревшие в версии 3.10, теперь удалены. Вместо них используйте find_spec().

create_module(spec)

Реализация importlib.abc.Loader.create_module(), которая возвращает None для явного запроса семантики по умолчанию.

Added in version 3.10.

exec_module(module)

Реализация importlib.abc.Loader.exec_module().

Added in version 3.10.

find_spec(fullname, target=None)

Реализация importlib.abc.PathEntryFinder.find_spec().

Added in version 3.10.

get_code(fullname)

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

get_data(pathname)

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

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

get_filename(fullname)

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

Added in version 3.1.

get_source(fullname)

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

is_package(fullname)

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

load_module(fullname)

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

Не рекомендуется, начиная с версии 3.10: Вместо этого используйте exec_module().

invalidate_caches()

Очистите внутренний кэш информации о файлах, найденных в ZIP-архиве.

Added in version 3.10.

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')  # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'example.zip/jwzthreading.py'