zipimport --- Zip アーカイブからモジュールをインポートする¶
ソースコード: Lib/zipimport.py
ZIP 形式のアーカイブから Python モジュール (*.py、*.pyc) とパッケージをインポートできるようにするモジュールです。
通常は zipimport モジュールを明示的に使う必要はありません。
sys.path の要素が ZIP アーカイブへのパスである場合に、組み込みの import 機構が自動的に使います。
普通、 sys.path はディレクトリ名の文字列からなるリストです。このモジュールを使うと、 sys.path の要素に ZIP ファイルアーカイブを示す文字列を使えるようになります。ZIP アーカイブにはサブディレクトリ構造を含めることができ、パッケージの import をサポートさせたり、アーカイブ内のパスを指定してサブディレクトリ下から import を行わせたりできます。例えば、 example.zip/lib/ のように指定すると、アーカイブ中の lib/ サブディレクトリ下だけから import を行います。
ZIP アーカイブ内にはどんなファイルを置いてもかまいませんが、インポートは .py および .pyc ファイルにのみ呼び出されます。動的モジュール (.pyd, .so) の ZIP インポートは行えません。アーカイブ内に .py ファイルしかない場合、 Python は対応する .pyc ファイルを追加してアーカイブを変更しようとはしません。つまり、 ZIP アーカイブ内に .pyc がない場合は、インポートが多少遅くなるかもしれないので注意してください。
バージョン 3.15 で変更: Zstandard (zstd) で圧縮された zip ファイルのエントリーをサポートしました。
バージョン 3.13 で変更: ZIP64 をサポートしました。
バージョン 3.8 で変更: 以前は、アーカイブコメント付きの ZIP アーカイブはサポートされていませんでした。
参考
- PKZIP Application Note
ZIP ファイルフォーマットおよびアルゴリズムを作成した Phil Katz によるドキュメント。
- PEP 273 - Zip アーカイブからモジュールをインポートする
このモジュールの実装も行った、James C. Ahlstrom による PEP です。Python 2.3 は PEP 273 の仕様に従っていますが、Just van Rossum の書いた import フックによる実装を使っています。インポートフックは PEP 302 で解説されています。
importlib-importの実装すべてのインポーターが実装するための関連プロトコルを提供するパッケージ。
このモジュールでは例外を一つ定義しています:
- exception zipimport.ZipImportError¶
zipimporter オブジェクトが送出する例外です。
ImportErrorのサブクラスなので、ImportErrorとしても捕捉できます。
zipimporter オブジェクト¶
zipimporter は ZIP ファイルを import するためのクラスです。
- class zipimport.zipimporter(archivepath)¶
新たな zipimporter インスタンスを生成します。 archivepath は ZIP ファイルへのパスまたは ZIP ファイル中の特定のパスへのパスでなければなりません。たとえば、
foo/bar.zip/libという archivepath の場合、foo/bar.zipという ZIP ファイルの中のlibディレクトリにあるモジュールを (存在するものとして) 検索します。archivepath が有効な ZIP アーカイブを指していない場合、
ZipImportErrorを送出します。バージョン 3.12 で変更: 3.10 で非推奨になった
find_loader()メソッドとfind_module()メソッドを削除しました。 代わりにfind_spec()を使ってください。- create_module(spec)¶
importlib.abc.Loader.create_module()の実装で、Noneを返してデフォルトの動作を明示的に要求します。Added in version 3.10.
- exec_module(module)¶
importlib.abc.Loader.exec_module()の実装です。Added in version 3.10.
- find_spec(fullname, target=None)¶
importlib.abc.PathEntryFinder.find_spec()の実装です。Added in version 3.10.
- get_code(fullname)¶
fullname に指定したモジュールのコードオブジェクトを返します。モジュールがインポートできなかった場合には
ZipImportErrorを送出します。
- get_filename(fullname)¶
指定したモジュールをインポートした場合に
__file__に設定される値を返します。 モジュールが見つからない場合はZipImportErrorを送出します。Added in version 3.1.
- get_source(fullname)¶
fullname で指定されたモジュールのソースコードを返します。モジュールが見つからない場合、
ZipImportErrorを送出します。アーカイブにはモジュールがあるもののソースコードがない場合、Noneを返します。
- is_package(fullname)¶
fullname で指定されたモジュールがパッケージの場合
Trueを返します。モジュールを見つけられない場合ZipImportErrorを送出します。
- invalidate_caches()¶
ZIP アーカイブ内のファイルに関する情報を保持する内部キャッシュをクリアします。
Added in version 3.10.
- archive¶
importer に関連付けられた 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
>>> # モジュール検索パスの先頭にアーカイブを追加する
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example
>>> example.__file__
'example_archive.zip/example.py'