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/lib的 archivepath 將在 ZIP 文件foo/bar.zip中的lib目錄中查找模塊。如果 archivepath 沒有指向一個有效的 ZIP 檔案,引發
ZipImportError。-
find_module(fullname[, path])? 搜索由 fullname 指定的模塊。 fullname 必須是完全合格的(含加點作分割的拓展名)模塊名。它返回 zipimporter 實例本身如果模塊被找到,或者返回
None如果沒找到指定模塊。可選的 path 被忽略,這是為了與導入器協議兼容。
-
get_code(fullname)? 返回指定模塊的代碼對象。如果不能找到模塊會引發
ZipImportError錯誤。
-
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 對象的空字符串。
當與斜杠結合使用時,
archive和prefix屬性等價于賦予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'
