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


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

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

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

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

參見

PKZIP Application Note

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

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

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

PEP 302 - 新導入鉤

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

此模塊定義了一個異常:

exception zipimport.ZipImportError?

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

zipimporter 對象?

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

class zipimport.zipimporter(archivepath)?

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

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

find_module(fullname[, path])?

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

get_code(fullname)?

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

get_data(pathname)?

返回與 pathname 相關聯的數據。如果不能找到文件則引發 OSError 錯誤。

在 3.3 版更改: IOError 代替 OSError 被引發。

get_filename(fullname)?

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

3.1 新版功能.

get_source(fullname)?

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

is_package(fullname)?

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

load_module(fullname)?

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

archive?

導入器關聯的 ZIP 文件的文件名,不含可能的子路徑。

prefix?

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

當與斜杠結合使用時, archiveprefix 屬性等價于賦予 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'