zipimport
— 从 Zip 归档中导入模块¶
源代码: Lib/zipimport.py
此模块添加了从 ZIP 格式归档导入 Python 模块 (*.py
、*.pyc
) 和包的能力。通常不需要显式使用 zipimport
模块;内置 import
机制会自动使用它,以导入指向 ZIP 归档的 sys.path
项。
通常,sys.path
是一个字符串形式的目录名称列表。此模块还允许 sys.path
的一项是一个命名 ZIP 文件归档的字符串。ZIP 归档可以包含一个子目录结构以支持包导入,并且可以指定归档中的路径以仅从子目录导入。例如,路径 example.zip/lib/
将仅从归档中的 lib/
子目录导入。
ZIP 存档中可能包含任何文件,但仅对 .py
和 .pyc
文件调用导入程序。不允许动态模块(.pyd
、.so
)的 ZIP 导入。请注意,如果存档仅包含 .py
文件,Python 不会尝试通过添加相应的 .pyc
文件来修改存档,这意味着如果 ZIP 存档不包含 .pyc
文件,导入可能会相当慢。
3.8 版中已更改: 以前,不支持带有存档注释的 ZIP 存档。
另请参阅
- PKZIP 应用说明
Phil Katz(该格式和算法的创建者)编写的 ZIP 文件格式文档。
- PEP 273 - 从 ZIP 存档导入模块
由 James C. Ahlstrom 撰写,他还提供了一个实现。Python 2.3 遵循 PEP 273 中的规范,但使用 Just van Rossum 编写的实现,该实现使用 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
将在 ZIP 文件foo/bar.zip
中的lib
目录中查找模块(如果存在)。ZipImportError
如果archivepath 未指向有效的 ZIP 存档,则会引发该错误。在版本 3.12 中更改:方法
find_loader()
和find_module()
在 3.10 中已弃用,现已删除。改为使用find_spec()
。- create_module(spec)¶
实现
importlib.abc.Loader.create_module()
,它返回None
以明确请求默认语义。在版本 3.10 中添加。
- exec_module(module)¶
实现
importlib.abc.Loader.exec_module()
。在版本 3.10 中添加。
- find_spec(fullname, target=None)¶
实现
importlib.abc.PathEntryFinder.find_spec()
。在版本 3.10 中添加。
- get_code(fullname)¶
返回指定模块的代码对象。如果无法导入模块,则引发
ZipImportError
。
- get_filename(fullname)¶
如果导入指定模块,则返回
__file__
将设置的值。如果无法导入模块,则引发ZipImportError
。在版本 3.1 中添加。
- get_source(fullname)¶
返回指定模块的源代码。如果找不到模块,则引发
ZipImportError
;如果归档包含该模块,但没有其源代码,则返回None
。
- is_package(fullname)¶
如果 fullname 指定的模块是包,则返回
True
。如果找不到模块,则引发ZipImportError
。
- load_module(fullname)¶
加载 fullname 指定的模块。fullname 必须是完全限定的(带点的)模块名称。成功时返回导入的模块,失败时引发
ZipImportError
。自 3.10 版弃用:请改用
exec_module()
。
- invalidate_caches()¶
清除 ZIP 归档中找到的文件信息的内部缓存。
在版本 3.10 中添加。
- archive¶
导入程序关联的 ZIP 文件的文件名,没有可能的子路径。
- prefix¶
ZIP 文件中搜索模块的子路径。对于指向 ZIP 文件根目录的 zipimporter 对象,这是空字符串。
当
archive
和prefix
属性与斜杠组合时,等于传递给zipimporter
构造函数的原始 archivepath 参数。
示例¶
下面是一个从 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'