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

源代碼: Lib/zipimport.py


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

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

參見(jiàn)

PKZIP Application Note

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

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

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

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

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

此模塊定義了一個(gè)異常:

exception zipimport.ZipImportError?

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

zipimporter 對(duì)象?

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

class zipimport.zipimporter(archivepath)?

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

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

create_module(spec)?

返回 None 來(lái)顯式地請(qǐng)求默認(rèn)語(yǔ)義的 importlib.abc.Loader.create_module() 實(shí)現(xiàn)。

3.10 新版功能.

exec_module(module)?

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

3.10 新版功能.

find_loader(fullname, path=None)?

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

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

find_module(fullname, path=None)?

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

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

find_spec(fullname, target=None)?

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

3.10 新版功能.

get_code(fullname)?

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

get_data(pathname)?

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

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

get_filename(fullname)?

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

3.1 新版功能.

get_source(fullname)?

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

is_package(fullname)?

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

load_module(fullname)?

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

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

invalidate_caches()?

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

3.10 新版功能.

archive?

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

prefix?

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

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

例子?

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