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. Импорт динамических модулей в формате ZIP (.pyd, .so) запрещен. Обратите внимание, что если архив содержит только .py файлов, Python не будет пытаться изменить архив, добавив соответствующий файл .pyc, что означает, что если ZIP-архив не содержит .pyc файлов, импорт может быть довольно медленным.

Изменено в версии 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-архив.

create_module(spec)

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

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

exec_module(module)

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

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

find_loader(fullname, path=None)

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

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

find_module(fullname, path=None)

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

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

find_spec(fullname, target=None)

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

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

get_code(fullname)

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

get_data(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.

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

invalidate_caches()

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

Добавлено в версии 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'
Вернуться на верх