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/lib
的 archivepath 將在 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_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í),
archive
和prefix
屬性等價(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'