zipimport — 从 Zip 档案中导入模块 — Python 文档

来自菜鸟教程
Python/docs/3.9/library/zipimport
跳转至:导航、​搜索

zipimport — 从 Zip 档案导入模块

源代码: :source:`Lib/zipimport.py`



此模块添加了从 ZIP 格式存档导入 Python 模块(*.py*.pyc)和包的功能。 通常不需要显式使用 zipimport 模块; 它由内置的 import 机制自动用于 sys.path 项目,这些项目是 ZIP 档案的路径。

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

ZIP 存档中可能存在任何文件,但只有文件 .py.pyc 可用于导入。 不允许 ZIP 导入动态模块(.pyd.so)。 请注意,如果存档仅包含 .py 文件,Python 将不会尝试通过添加相应的 .pyc 文件来修改存档,这意味着如果 ZIP 存档不包含 .pyc ] 文件,导入可能会很慢。

3.8 版更改: 以前,不支持带有存档注释的 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

zipimporter 对象

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

class zipimport.zipimporter(archivepath)

创建一个新的 zipimporter 实例。 archivepath 必须是 ZIP 文件的路径,或 ZIP 文件中的特定路径。 例如,foo/bar.zip/libarchivepath 将在 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 关联的数据。 如果找不到文件,则引发 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

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'