zipimport
--- 從 Zip 封存檔案匯入模組¶
原始碼:Lib/zipimport.py
此模組新增了從 ZIP 格式封存檔案中引入 Python 模組(*.py
、*.pyc
)和套件的能力。通常不需要明確地使用 zipimport
模組;對於 sys.path
中指向 ZIP 封存檔案路徑的項目,內建的 import
機制會自動使用它。
通常 sys.path
是一個由目錄名稱字串組成的串列。此模組也允許 sys.path
的一個項目是命名 ZIP 封存檔案的字串。ZIP 封存檔案可以包含子目錄結構以支援套件引入,並且可以指定封存檔案內的路徑以僅從子目錄中引入。例如路徑 example.zip/lib/
將只會從封存檔案內的 lib/
子目錄中引入。
ZIP 封存檔案中可以存在任何檔案,但引入器只會對 .py
和 .pyc
檔案起作用。不允許從 ZIP 引入動態模組(.pyd
、.so
)。請注意,如果封存檔案只包含 .py
檔案,Python 將不會試圖透過新增對應的 .pyc
檔案來修改封存檔案,這意味著如果 ZIP 封存檔案不包含 .pyc
檔案,引入可能會相當慢。
在 3.13 版的變更: 支援 ZIP64。
在 3.8 版的變更: 在過去,不支援帶有封存檔案註解的 ZIP 封存檔案。
也參考
- PKZIP Application Note
由 ZIP 格式和所用演算法的創造者 Phil Katz 編寫的關於 ZIP 檔案格式的文件。
- PEP 273 - 從 Zip 封存檔案引入模組
由 James C. Ahlstrom 編寫,他也提供了一個實作。Python 2.3 遵循 PEP 273 中的規範,但使用由 Just van Rossum 編寫的實作,該實作使用了 PEP 302 中描述的引入掛鉤。
importlib
- 引入機制的實作提供所有引入器要實作的相關協定的套件。
此模組定義了一個例外:
- 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
。在 3.12 版的變更: 在 3.10 版中已棄用的
find_loader()
和find_module()
方法現已被移除。請改用find_spec()
。- create_module(spec)¶
importlib.abc.Loader.create_module()
的實作,回傳None
以明確請求預設語意。在 3.10 版被加入.
- exec_module(module)¶
importlib.abc.Loader.exec_module()
的實作。在 3.10 版被加入.
- find_spec(fullname, target=None)¶
importlib.abc.PathEntryFinder.find_spec()
的一個實作。在 3.10 版被加入.
- 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
。在 3.10 版之後被棄用: 請改用
exec_module()
。
- invalidate_caches()¶
清除關於在 ZIP 封存檔案中找到的檔案資訊的內部快取。
在 3.10 版被加入.
- archive¶
引入器關聯的 ZIP 檔案的檔名,不包含可能的子路徑。
- prefix¶
在 ZIP 檔案內搜尋模組的子路徑。對於指向 ZIP 檔案根目錄的 zipimporter 物件,這是一個空字串。
archive
和prefix
屬性(attribute),當用斜線組合時,等於給予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') # 將 .zip 檔案新增到系統路徑的最前面
>>> import jwzthreading
>>> jwzthreading.__file__
'example.zip/jwzthreading.py'