31.4. zipimport-从 Zip 存档导入模块

2.3 版的新Function。

该模块增加了从 ZIP 格式 Files 中导入 Python 模块(*.py*.py[co])和包的Function。通常不需要显式使用zipimport模块;内置import机制会自动将它用于 ZIPFiles 路径的sys.path项。

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

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

如果在从 ZIP 归档文件加载的模块上调用,则无法使用内置的reload()函数;不太可能需要reload(),因为这意味着 ZIP 在运行时已更改。

当前不支持带有存档 Comments 的 ZIP 存档。

See also

  • PKZIP 应用说明

  • ZIP 文件格式的文档,作者是 Phil Katz,他是该格式和算法的创建者。

  • PEP 273-从 Zip 存档导入模块

  • 由 James C. Ahlstrom 撰写,他也提供了一个实现。 Python 2.3 遵循 PEP 273 中的规范,但是使用 Just van Rossum 编写的实现,该实现使用 PEP 302 中描述的导入钩子。

  • PEP 302-新的导入钩子

  • PEP 添加有助于该模块工作的导入钩子。

该模块定义了一个异常:

  • exception zipimport. ZipImportError

31.4.1. zipimporter 对象

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

    • class * zipimport. zipimporter(* archivepath *)
    • 创建一个新的 zipimporter 实例。 * archivepath *必须是 ZIP 文件的路径,或者是 ZIP 文件中的特定路径。例如,存档路径(foo/bar.zip/lib)将在 ZIP 文件foo/bar.zip(假设它存在)中的lib目录中查找模块。

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

  • find_module((全名 [,路径])

    • 搜索* fullname *指定的模块。 * fullname 必须是标准的(加点的)模块名称。如果找到模块,则返回 zipimporter 实例本身,否则返回None。可选的 path *参数将被忽略-此处是为了与导入程序协议兼容。
  • get_code(全名)

    • 返回指定模块的代码对象。如果找不到该模块,请引发ZipImportError
  • get_data(* pathname *)

    • 返回与* pathname *关联的数据。如果找不到该文件,请提高IOError
  • get_filename(全名)

    • 如果导入了指定的模块,则将返回值__file__设置为。如果找不到该模块,请引发ZipImportError

2.7 版的新Function。

  • get_source(全名)

    • 返回指定模块的源代码。如果找不到模块,则引发ZipImportError;如果存档中确实包含该模块,但没有源,则返回None
  • is_package(全名)

    • 如果* fullname *指定的模块是软件包,则返回True。如果找不到该模块,请引发ZipImportError
  • load_module(全名)

    • 加载* fullname *指定的模块。 * fullname *必须是标准的(加点的)模块名称。它返回导入的模块,或者如果找不到则引发ZipImportError
  • archive

    • 导入程序的关联 ZIP 文件的文件名,没有可能的子路径。
  • prefix

    • ZIP 文件中搜索模块的子路径。这是 zipimporter 对象的空字符串,它指向 ZIP 文件的根。

archiveprefix属性与斜杠结合使用时,等于赋予zipimporter构造函数的原始* archivepath *参数。

31.4.2. Examples

这是一个从 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'