zipimport– 从Zip存档导入模块


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

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

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

目前不支持带存档注释的ZIP存档.

也可以看看

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

这个模块定义了一个例外:

exception zipimport.ZipImportError

zipimporter对象引发的异常。它是ImportError的子类,所以它也可以被ImportError抓住.

zipimporter对象

zipimporter是导入ZIP文件的类.

class zipimport.zipimporterarchivepath

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

ZipImportError如果archivepath没有指向有效的ZIParchive,则会被提出

find_module (fullname [, path])

搜索fullname. fullname指定的模块必须是完全限定(点线)的模块名称。如果找到模块,则返回zipimporter实例,如果不是,则返回None。可选的path参数被忽略 – 它与导入器协议兼容.

get_code (fullname)

返回指定模块的代码对象。如果找不到模块,请举起ZipImportError.

get_data(pathname)

返回与pathname相关的数据。如果找不到文件,请OSError举起

改进版本3.3:IOError以前用来代替OSError.

get_filenamefullname

如果导入指定的模块,则返回值__file__将被设置为。如果模块无法发出ZipImportError举起

版本3.1.

get_source (fullname)

中的新内容返回指定模块的源代码。如果找不到模块,请举起ZipImportError,返回None如果存档确实包含模块,但没有源它.

is_packagefullname

返回True如果由指定的模块fullname是一个包。提高ZipImportError如果找不到模块的话

load_modulefullname

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

archive

导入器关联的ZIP文件的文件名,没有可能的子路径.

prefix

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

archiveprefix属性,当与aslash结合时,等于给archivepath构造函数的原始zipimporter参数.

示例

这是一个从ZIP存档导入模块的示例 – 请注意zipimport模块没有明确使用.

$ unzip -l example.zipArchive:  example.zip  Length     Date   Time    Name --------    ----   ----    ----     8467  11-26-02 22:30   jwzthreading.py --------                   -------     8467                   1 file$ ./pythonPython 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"