zipimport

2.3版本的新功能。

该模块增加了从ZIP格式档案中导入Python模块(*.py*.py[co])和软件包的功能。通常不需要zipimport明确使用该模块; 内置import机制会自动使用它作为sys.pathZIP归档路径的项目。

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

任何文件可能存在于ZIP压缩文件,但只有文件.py.py[co]可供导入。动态模块(.pyd.so)的ZIP导入是不允许的。请注意,如果归档仅包含.py的文件,Python将不会试图通过增加相应的修改该文件.pyc.pyo文件,这意味着如果一个ZIP压缩文件不包含.pyc文件,进口可能会相当缓慢。

reload()如果调用从ZIP压缩文件加载的模块,则使用内置函数将失败; 这是不太可能的reload(),因为这意味着ZIP在运行时被改变了。

目前不支持带归档评论的ZIP归档。

另请参阅

PKZIP应用说明由Phil Katz 撰写的关于ZIP文件格式的文件,它是所使用的格式和算法的创建者。 PEP 273 - 从Zip档案导入模块James C. Ahlstrom撰写,他也提供了一个实现。Python 2.3遵循PEP 273中的规范,但使用Just van Rossum编写的使用PEP 302中描述的导入钩子的实现 。PEP 302 - 新导入钩子PEP添加有助于此模块工作的导入钩子。

该模块定义了一个例外:

exception zipimport.ZipImportError

zipimporter对象引发异常。这是它的一个子类ImportError,所以它也可以被捕获ImportError

1. zipimporter对象

zipimporter 是导入ZIP文件的类。

class zipimport.zipimporter(archivepath)

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

ZipImportError如果archivepath未指向有效的ZIP存档,则会引发此问题。

find_module(fullname[, path])

搜索由全名指定的模块。完整名称必须是完全限定的(虚线)模块名称。它返回zipimporter实例本身,如果找到该模块,或者None它不是。可选的路径参数被忽略 - 它在那里与进口协议兼容。

get_code(fullname)

返回指定模块的代码对象。ZipImportError如果找不到该模块,请升级。

get_data(pathname)

返回与路径名关联的数据。提高IOError如果没有找到该文件。

get_filename(fullname)

__file__如果指定的模块被导入,返回值将被设置为。ZipImportError如果找不到该模块,请升级。

2.7版本的新功能。

get_source(fullname)

返回指定模块的源代码。ZipImportError如果找不到该模块,None则进行提升,如果存档确实包含该模块,则返回,但没有来源。

is_package(fullname)

返回True如果由指定的模块全名是一个包。ZipImportError如果找不到该模块,请升级。

load_module(fullname)

加载由全名指定的模块。完整名称必须是完全限定的(虚线)模块名称。它返回导入的模块,或者ZipImportError如果找不到则引发。

archive

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

prefix

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

当与斜线组合时,archiveprefix属性等于给予构造函数的原始归档路径参数zipimporter

2.例子

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

扫码关注云+社区

领取腾讯云代金券