zipimport ---从zip存档导入模块

源代码: Lib/zipimport.py


这个模块增加了导入python模块的能力 (*.py*.pyc )以及压缩格式档案中的文件包。通常不需要使用 zipimport 模块显式地;它由内置的 import 机制 sys.path 作为zip存档文件路径的项。

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

压缩文件中可能存在任何文件,但只有文件 .py.pyc 可以导入。动态模块的zip导入 (.pyd.so )不允许。请注意,如果存档仅包含 .py 文件,python不会尝试通过添加相应的 .pyc 文件,这意味着如果压缩文件不包含 .pyc 文件,导入可能相当慢。

在 3.8 版更改: 以前,不支持带有存档注释的zip存档。

参见

PKZIP Application Note

文件的压缩文件格式由菲尔卡茨,格式和算法的创建者使用。

PEP 273 -从zip存档导入模块

作者JamesC.Ahlstrom,他也提供了一个实现。python 2.3遵循中的规范 PEP 273 ,但使用了一个仅由van Rossum编写的实现,该实现使用中描述的导入挂钩 PEP 302 .

importlib --实施进口机械

为所有进口商提供相关协议以供实施的软件包。

此模块定义了一个异常:

exception zipimport.ZipImportError

ZipImporter对象引发异常。它是 ImportError ,所以它可以被捕获为 ImportError 也是。

ZipImporter对象

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

class zipimport.zipimporter(archivepath)

创建新的ZipImporter实例。 档案室 必须是zip文件的路径,或者是zip文件中的特定路径。例如,一个 档案室 属于 foo/bar.zip/lib 将在中查找模块 lib zip文件中的目录 foo/bar.zip (前提是它存在)。

ZipImportError 如果 档案室 未指向有效的zip存档。

create_module(spec)

实施 importlib.abc.Loader.create_module() 那就回来了 None 显式请求默认语义。

3.10 新版功能.

exec_module(module)

实施 importlib.abc.Loader.exec_module()

3.10 新版功能.

find_loader(fullname, path=None)

一种实现 importlib.abc.PathEntryFinder.find_loader()

3.10 版后已移除: 使用 find_spec() 取而代之的是。

find_module(fullname, path=None)

搜索由指定的模块 全名 . 全名 必须是完全限定(虚线)模块名。如果找到模块,则返回zipImporter实例本身,或者 None 如果不是的话。可选 path 参数被忽略---这是为了与导入程序协议兼容。

3.10 版后已移除: 使用 find_spec() 取而代之的是。

find_spec(fullname, target=None)

一种实现 importlib.abc.PathEntryFinder.find_spec()

3.10 新版功能.

get_code(fullname)

返回指定模块的代码对象。加薪 ZipImportError 如果模块无法导入。

get_data(pathname)

返回与关联的数据 路径名 . 提高 OSError 如果找不到文件。

在 3.3 版更改: IOError 以前被引发而不是 OSError .

get_filename(fullname)

返回值 __file__ 如果导入了指定的模块,则将设置为。加薪 ZipImportError 如果模块无法导入。

3.1 新版功能.

get_source(fullname)

返回指定模块的源代码。提高 ZipImportError 如果找不到模块,返回 None 如果存档文件确实包含模块,但没有该模块的源。

is_package(fullname)

返回 True 如果模块由指定 全名 是一个包裹。提高 ZipImportError 如果找不到模块。

load_module(fullname)

加载由指定的模块 全名全名 必须是完全限定(点分)的模块名称。成功时返回导入的模块,引发 ZipImportError 在失败的时候。

3.10 版后已移除: 使用 exec_module() 取而代之的是。

archive

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

prefix

在zip文件中搜索模块的子路径。这是指向zip文件根目录的zipImporter对象的空字符串。

这个 archiveprefix 属性与斜线组合时,等于原始属性 档案室 给出给 zipimporter 构造函数。

实例

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