zipimport — 从Zip存档导入模块

源代码: Lib/zipimport.py


这个模块增加了从ZIP格式的存档中导入Python模块(*.py*.pyc)和包的功能。通常不需要显式使用zipimport模块;对于sys.path中指向ZIP存档的项,它会被内置的import机制自动使用。

通常,sys.path是一个由字符串表示的目录名列表。此模块还允许sys.path中的项是一个命名ZIP文件存档的字符串。ZIP存档可以包含一个子目录结构以支持包导入,并且可以指定存档内的路径以仅从子目录导入。例如,路径example.zip/lib/将只从存档内的lib/子目录导入。

ZIP存档中可以存在任何文件,但仅对.py.pyc文件调用导入器。禁止ZIP导入动态模块(.pyd, .so)。请注意,如果存档仅包含.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 文件内特定路径的路径。例如,*archivepath* 为 foo/bar.zip/lib 将在 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 版本开始已弃用,并将在 3.15 版本中移除: 请改用 exec_module()

invalidate_caches()

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

在 3.10 版本加入。

archive

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

prefix

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

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

示例

这是一个从 ZIP 存档导入模块的示例——请注意 zipimport 模块并未被显式使用。

$ unzip -l example_archive.zip
Archive:  example_archive.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     8467  01-01-00 12:30   example.py
 --------                   -------
     8467                   1 file
>>> import sys
>>> # Add the archive to the front of the module search path
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example
>>> example.__file__
'example_archive.zip/example.py'