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_data(pathname)

返回與 *pathname* 相關聯的資料。如果未找到檔案,則引發 OSError

在 3.3 版本發生變更: 過去會引發 IOError,現在它是 OSError 的別名。

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 物件,這是一個空字串。

archiveprefix 屬性,當與斜槓結合時,等於提供給 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'