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
, если файл не был найден.
- 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'