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.13 版本中变更: 支持 ZIP64

在 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 文件中特定路径的路径。例如,foo/bar.zip/libarchivepath 将在 ZIP 文件 foo/bar.zip 内的 lib 目录中查找模块(如果该目录存在)。

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

在 3.12 版本中变更: 3.10 中已弃用的方法 find_loader()find_module() 现在已删除。请改用 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_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 异常。

自 3.10 版本起弃用: 请改用 exec_module()

invalidate_caches()

清除关于 ZIP 归档文件中找到的文件的内部信息缓存。

3.10 版本中新增。

archive

导入器关联的 ZIP 文件的文件名,不包含可能的子路径。

prefix

在 ZIP 文件中搜索模块的子路径。对于指向 ZIP 文件根目录的 zipimporter 对象,此为空字符串。

archiveprefix 属性与斜杠组合时,等于传递给 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'