31.4. zipimport — 从 Zip 档案中导入模块 — Python 文档
31.4. 压缩导入 — 从 Zip 档案中导入模块
2.3 版中的新功能。
此模块添加了从 ZIP 格式存档导入 Python 模块(*.py
、*.py[co]
)和包的功能。 通常不需要显式使用 zipimport 模块; 它由内置的 import 机制自动用于 sys.path 项目,这些项目是 ZIP 档案的路径。
通常,sys.path 是字符串形式的目录名称列表。 此模块还允许 sys.path 项是命名 ZIP 文件存档的字符串。 ZIP 存档可以包含一个子目录结构以支持包导入,并且可以指定存档中的路径以仅从子目录导入。 例如,路径 example.zip/lib/
只会从存档中的 lib/
子目录导入。
ZIP 存档中可能存在任何文件,但只有文件 .py
和 .py[co]
可用于导入。 不允许 ZIP 导入动态模块(.pyd
、.so
)。 请注意,如果存档仅包含 .py
文件,Python 将不会尝试通过添加相应的 .pyc
或 .pyo
文件来修改存档,这意味着如果 ZIP 存档没有' t 包含 .pyc
文件,导入可能相当慢。
如果在从 ZIP 存档加载的模块上调用,使用内置的 reload() 函数将失败; 不太可能需要 reload(),因为这意味着 ZIP 在运行时已被更改。
当前不支持带有存档注释的 ZIP 存档。
也可以看看
- PKZIP 应用说明
- 所用格式和算法的创建者 Phil Katz 关于 ZIP 文件格式的文档。
- PEP 273 - 从 Zip 档案导入模块
- 由詹姆斯 C. Ahlstrom,他也提供了一个实现。 Python 2.3 遵循 PEP 273 中的规范,但使用 Just van Rossum 编写的实现,该实现使用 PEP 302 中描述的导入钩子。
- PEP 302 - 新的进口挂钩
- 添加有助于此模块工作的导入挂钩的 PEP。
该模块定义了一个异常:
- exception zipimport.ZipImportError
- zipimporter 对象引发的异常。 它是
ImportError
的子类,因此也可以捕获为ImportError
。
31.4.1. zipimporter 对象
zipimporter 是用于导入 ZIP 文件的类。
- class zipimport.zipimporter(archivepath)
创建一个新的 zipimporter 实例。 archivepath 必须是 ZIP 文件的路径,或 ZIP 文件中的特定路径。 例如,
foo/bar.zip/lib
的 archivepath 将在 ZIP 文件foo/bar.zip
内的lib
目录中查找模块(前提是它存在)。ZipImportError 如果 archivepath 未指向有效的 ZIP 存档,则会引发。
- find_module(fullname[, path])
搜索由 fullname 指定的模块。 fullname 必须是完全限定的(虚线)模块名称。 如果找到模块,它返回 zipimporter 实例本身,否则返回 None。 可选的 path 参数被忽略——它的存在是为了与导入器协议兼容。
- get_code(fullname)
返回指定模块的代码对象。 如果找不到模块,则引发 ZipImportError。
- get_data(pathname)
返回与 pathname 关联的数据。 如果找不到文件,则提高
IOError
。
- get_filename(fullname)
如果导入了指定的模块,则返回值
__file__
将被设置为。 如果找不到模块,则引发 ZipImportError。
2.7 版中的新功能。
- get_source(fullname)
返回指定模块的源代码。 如果找不到模块,则引发 ZipImportError,如果存档确实包含模块,但没有源,则返回 None。
- is_package(fullname)
如果 fullname 指定的模块是包,则返回
True
。 如果找不到模块,则引发 ZipImportError。
- load_module(fullname)
加载由 fullname 指定的模块。 fullname 必须是完全限定的(虚线)模块名称。 它返回导入的模块,如果未找到则引发 ZipImportError。
- archive
导入器关联 ZIP 文件的文件名,没有可能的子路径。
- prefix
ZIP 文件中搜索模块的子路径。 这是指向 ZIP 文件根目录的 zipimporter 对象的空字符串。
archive 和 prefix 属性与斜杠结合使用时,等于提供给 zipimporter 构造函数的原始 archivepath 参数。
31.4.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'