"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 Application Note
     Phil Katz 编写的 ZIP 文件格式文档，此格式和使用的算法的创建者。

  **PEP 273** - 从 ZIP 压缩包导入模块
     由 James C. Ahlstrom 编写，他也提供了实现。 Python 2.3 遵循 **PEP
     273** 的规范，但是使用 Just van Rossum 编写的使用了 **PEP 302**
     中描述的导入钩的实现。

  **PEP 302** - 新导入钩
     The PEP to add the import hooks that help this module work.

此模块定义了一个异常：

exception zipimport.ZipImportError

   异常由 zipimporter 对象引发。这是 "ImportError" 的子类，因此，也可
   以捕获为 "ImportError" 。


zipimporter 对象
================

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

class zipimport.zipimporter(archivepath)

   创建新的 zipimporter 实例。 *archivepath* 必须是指向 ZIP 文件的路径
   ，或者 ZIP 文件中的特定路径。例如， "foo/bar.zip/lib" 的
   *archivepath* 将在 ZIP 文件 "foo/bar.zip" 中的 "lib" 目录中查找模块
   （只要它存在）。

   如果 *archivepath* 没有指向一个有效的 ZIP 档案，引发
   "ZipImportError" 。

   find_module(fullname[, path])

      搜索由 *fullname* 指定的模块。 *fullname* 必须是完全合格的（点分
      的）模块名。它返回 zipimporter 实例本身如果模块被找到，或者返回
      "None" 如果没找到指定模块。可选的 *path* 被忽略，这是为了与导入
      器协议兼容。

   get_code(fullname)

      Return the code object for the specified module. Raise
      "ZipImportError" if the module couldn't be found.

   get_data(pathname)

      返回与 *pathname* 相关联的数据。如果不能找到文件则引发 "OSError"
      错误。

      在 3.3 版更改: 曾经是 "IOError" 被引发而不是 "OSError" 。

   get_filename(fullname)

      Return the value "__file__" would be set to if the specified
      module was imported. Raise "ZipImportError" if the module
      couldn't be found.

      3.1 新版功能.

   get_source(fullname)

      返回指定模块的源代码。如果没有找到模块则引发 "ZipImportError" ，
      如果档案包含模块但是没有源代码，返回 "None" 。

   is_package(fullname)

      如果由 *fullname* 指定的模块是一个包则返回 "True" 。如果不能找到
      模块则引发 "ZipImportError" 错误。

   load_module(fullname)

      Load the module specified by *fullname*. *fullname* must be the
      fully qualified (dotted) module name. It returns the imported
      module, or raises "ZipImportError" if it wasn't found.

   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'
