zipimport --- 從 Zip 存檔中導入模塊?


此模塊添加了從 ZIP 格式檔案中導入 Python 模塊( *.py , *.pyc )和包的能力。通常不需要明確地使用 zipimport 模塊,內(nèi)置的 import 機制會自動將此模塊用于 ZIP 檔案路徑的 sys.path 項目上。

通常, sys.path 是字符串的目錄名稱列表。此模塊同樣允許 sys.path 的一項成為命名 ZIP 文件檔案的字符串。 ZIP 檔案可以容納子目錄結(jié)構(gòu)去支持包的導入,并且可以將歸檔文件中的路徑指定為僅從子目錄導入。比如說,路徑 example.zip/lib/ 將只會從檔案中的 lib/ 子目錄導入。

任何文件都可以存在于 ZIP檔案之中,但是只有 .py.pyc 文件是能夠?qū)氲?。不允許導入 ZIP 中的動態(tài)模組( .pyd , .so )。請注意,如果檔案中只包含 .py 文件, Python不會嘗試通過添加對應的 .pyc 文件修改檔案,意思是如果 ZIP 檔案不包含 .pyc 文件,導入或許會變慢。

目前不支持帶有檔案注釋的 ZIP 歸檔。

參見

PKZIP Application Note

Phil Katz 編寫的 ZIP 文件格式文檔,此格式和使用的算法的創(chuàng)建者。

PEP 273 - ?從ZIP壓縮包導入模塊

由 James C. Ahlstrom 編寫,他還提供了一個具體實現(xiàn)。 Python 2.3 遵循 PEP 273 的規(guī)范,但使用了一個由 van Rossum 本人所編寫的實現(xiàn),該實現(xiàn)使用了 PEP 302 所描述的導入鉤子。

PEP 302 - 新導入鉤

PEP 添加導入鉤來有助于模塊運作。

此模塊定義了一個異常:

exception zipimport.ZipImportError?

異常由 zipimporter 對象引發(fā)。這是 ImportError 的子類,因此,也可以捕獲為 ImportError 。

zipimporter 對象?

zipimporter 是用于導入 ZIP 文件的類。

class zipimport.zipimporter(archivepath)?

創(chuàng)建新的 zipimporter 實例。 archivepath 必須是指向 ZIP 文件的路徑,或者 ZIP 文件中的特定路徑。例如, foo/bar.zip/libarchivepath 將在 ZIP 文件 foo/bar.zip 中的 lib 目錄中查找模塊。

如果 archivepath 沒有指向一個有效的 ZIP 檔案,引發(fā) ZipImportError

find_module(fullname[, path])?

搜索由 fullname 指定的模塊。 fullname 必須是完全合格的(含加點作分割的拓展名)模塊名。它返回 zipimporter 實例本身如果模塊被找到,或者返回 None 如果沒找到指定模塊??蛇x的 path 被忽略,這是為了與導入器協(xié)議兼容。

get_code(fullname)?

返回指定模塊的代碼對象。如果不能找到模塊會引發(fā) ZipImportError 錯誤。

get_data(pathname)?

返回與 pathname 相關聯(lián)的數(shù)據(jù)。如果不能找到文件則引發(fā) OSError 錯誤。

在 3.3 版更改: IOError 代替 OSError 被引發(fā)。

get_filename(fullname)?

如果導入了指定的模塊 __file__ ,則返回為該模塊設置的值。如果未找到模塊則引發(fā) ZipImportError 錯誤。

3.1 新版功能.

get_source(fullname)?

返回指定模塊的源代碼。如果沒有找到模塊則引發(fā) ZipImportError ,如果檔案包含模塊但是沒有源代碼,返回 None 。

is_package(fullname)?

如果由 fullname 指定的模塊是一個包則返回 True 。如果不能找到模塊則引發(fā) ZipImportError 錯誤。

load_module(fullname)?

加載由 fullname 指定的模塊。 fullname 必須是完全合格的(含加點作為分割的拓展名)模塊名。它返回已加載模塊,或者當找不到模塊時引發(fā) ZipImportError 錯誤。

archive?

導入器關聯(lián)的 ZIP 文件的文件名,不含可能的子路徑。

prefix?

ZIP 文件中搜索的模塊的子路徑。這是一個指向 ZIP 文件 根目錄的 zipimporter 對象的空字符串。

當與斜杠結(jié)合使用時, archiveprefix 屬性等價于賦予 zipimporter 構(gòu)造器的原始 archivepath 參數(shù)。

例子?

這是一個從 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'