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 應用程式說明
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 檔案內特定路徑的路徑。例如,*archivepath* 為
foo/bar.zip/lib
將在 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 版本開始已棄用,並將在 3.15 版本中移除: 請改用
exec_module()
。
- invalidate_caches()¶
清除內部快取中關於 ZIP 存檔中找到的檔案的資訊。
在 3.10 版本加入。
- archive¶
匯入器關聯的 ZIP 檔案的檔名,不帶可能的子路徑。
- prefix¶
在 ZIP 檔案中搜索模組的子路徑。對於指向 ZIP 檔案根目錄的 zipimporter 物件,這是一個空字串。
archive
和prefix
屬性,當與斜槓結合時,等於提供給zipimporter
建構函式的原始 *archivepath* 引數。
示例¶
這是一個從 ZIP 存檔匯入模組的示例——請注意 zipimport
模組並未被顯式使用。
$ unzip -l example_archive.zip
Archive: example_archive.zip
Length Date Time Name
-------- ---- ---- ----
8467 01-01-00 12:30 example.py
-------- -------
8467 1 file
>>> import sys
>>> # Add the archive to the front of the module search path
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example
>>> example.__file__
'example_archive.zip/example.py'