zipimport --- 從 Zip 存檔中導(dǎo)入模塊?

源代碼: Lib/zipimport.py


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

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

Any files may be present in the ZIP archive, but importers are only invoked for .py and .pyc files. ZIP import of dynamic modules (.pyd, .so) is disallowed. Note that if an archive only contains .py files, Python will not attempt to modify the archive by adding the corresponding .pyc file, meaning that if a ZIP archive doesn't contain .pyc files, importing may be rather slow.

在 3.8 版更改: 以前,不支持帶有檔案注釋的 ZIP 檔案。

參見

PKZIP Application Note

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

PEP 273 -  從ZIP壓縮包導(dǎo)入模塊

由 James C. Ahlstrom 編寫,他也提供了實現(xiàn)。 Python 2.3 遵循 PEP 273 的規(guī)范,但是使用 Just van Rossum 編寫的使用了 PEP 302 中描述的導(dǎo)入鉤的實現(xiàn)。

importlib - 導(dǎo)入機制的實現(xiàn)

為所有導(dǎo)入器的實現(xiàn)提供相關(guān)協(xié)議的包。

此模塊定義了一個異常:

exception zipimport.ZipImportError?

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

zipimporter 對象?

zipimporter 是用于導(dǎo)入 ZIP 文件的類。

class zipimport.zipimporter(archivepath)?

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

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

create_module(spec)?

返回 None 來顯式地請求默認語義的 importlib.abc.Loader.create_module() 實現(xiàn)。

3.10 新版功能.

exec_module(module)?

importlib.abc.Loader.exec_module() 的實現(xiàn)。

3.10 新版功能.

find_loader(fullname, path=None)?

importlib.abc.PathEntryFinder.find_loader() 的實現(xiàn)。

3.10 版后已移除: 使用 find_spec() 來代替。

find_module(fullname, path=None)?

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

3.10 版后已移除: 使用 find_spec() 來代替。

find_spec(fullname, target=None)?

importlib.abc.PathEntryFinder.find_spec() 的實現(xiàn)。

3.10 新版功能.

get_code(fullname)?

返回指定模塊的代碼對象。 如果模塊無法被導(dǎo)入則引發(fā) ZipImportError。

get_data(pathname)?

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

在 3.3 版更改: 曾經(jīng)是 IOError 被引發(fā)而不是 OSError

get_filename(fullname)?

返回如果指定模塊被導(dǎo)入則應(yīng)當要設(shè)置的 __file__ 值。 如果模塊無法被導(dǎo)入則引發(fā) ZipImportError。

3.1 新版功能.

get_source(fullname)?

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

is_package(fullname)?

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

load_module(fullname)?

導(dǎo)入由 fullname 所指定的模塊。 fullname 必須為(帶點號的)完整限定名稱。 成功時返回導(dǎo)入的模塊,失敗時引發(fā) ZipImportError。

3.10 版后已移除: 使用 exec_module() 來代替。

invalidate_caches()?

清除在 ZIP 歸檔文件中找到的相關(guān)文件信息的內(nèi)部緩存。

3.10 新版功能.

archive?

導(dǎo)入器關(guān)聯(lián)的 ZIP 文件的文件名,沒有可能的子路徑。

prefix?

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

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

例子?

這是一個從 ZIP 檔案中導(dǎo)入模塊的例子 - 請注意 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'