Skip to main content

31.1. zipimport —从Zip档案导入模块


此模块添加了从ZIP格式的归档导入Python模块(*.py*.py[co])和包的能力。通常不需要显式地使用 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 文件,导入可能会相当慢。

目前不支持具有存档注释的ZIP存档。

参见

PKZIP应用笔记

关于ZIP文件格式的文档由Phil Katz,使用的格式和算法的创建者。

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

31.1.1. zipimporter对象

zipimporter 是用于导入ZIP文件的类。

class zipimport.zipimporter(archivepath)

创建新的zipimporter实例。 archivepath 必须是ZIP文件的路径,或者是ZIP文件中的特定路径。例如,foo/bar.zip/libarchivepath 将在ZIP文件 foo/bar.zip (假设它存在)中的 lib 目录中查找模块。

如果 archivepath 未指向有效的ZIP存档,则会引发 ZipImportError

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)

如果 fullname 指定的模块是包,则返回 True。如果找不到模块,请提高 ZipImportError

load_module(fullname)

加载由 fullname 指定的模块。 fullname 必须是完全限定(点线)模块名称。它返回导入的模块,或者如果没有找到 ZipImportError 则提高 ZipImportError

archive

导入程序的关联ZIP文件的文件名,没有可能的子路径。

prefix

ZIP文件中搜索模块的子路径。这是指向ZIP文件根目录的zipimporter对象的空字符串。

archiveprefix 属性,当与斜杠组合时,等于给予 zipimporter 构造函数的原始 archivepath 参数。

31.1.2. 例子

下面是一个从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'