目次

前のトピックへ

31.2. imputil — Import ユーティリティ

次のトピックへ

31.4. pkgutil — パッケージ拡張ユーティリティ

このページ

31.3. zipimport — Zip アーカイブからモジュールを import する

バージョン 2.3 で追加.

このモジュールは、 Python モジュール (*.py, *.py[co]) やパッケージを ZIP 形式のアーカイブから import できるようにします。通常、 zipimport を明示的に使う必要はありません; 組み込みの import は、 sys.path の要素が ZIP アーカイブへのパスを指している場合にこのモジュールを自動的に使います。

普通、 sys.path はディレクトリ名の文字列からなるリストです。このモジュールを使うと、 sys.path の要素に ZIP ファイルアーカイブを示す文字列を使えるようになります。ZIP アーカイブにはサブディレクトリ構造を含めることができ、パッケージの import をサポートさせしたり、アーカイブ内のパスを指定してサブディレクトリ下から import を行わせたりできます。例えば、 /tmp/example.zip/lib/ のように指定すると、アーカイブ中の lib/ サブディレクトリ下だけから import を行います。

ZIP アーカイブ内にはどんなファイルを置いてもかまいませんが、 import できるのは .py および .py[co] だけです。動的モジュール (.pyd, .so) の ZIP import は行えません。アーカイブ内に .py ファイルしか入っていない場合、 Python がアーカイブを変更して、 .py ファイルに対応する .pyc.pyo ファイルを追加したりはしません。つまり、ZIP アーカイブ中に .pyc が入っていない場合、 import はやや低速になるかもしれないので注意してください。

ZIP アーカイブからロードしたモジュールに対して組み込み関数 reload() を呼び出すと失敗します; reload() が必要になるということは、実行時に ZIP ファイルが置き換えられてしまうことになり、あまり起こりそうにない状況だからです。

参考

PKZIP Application Note
ZIP ファイル形式の作者であり、ZIP で使われているアルゴリズムの作者でもある Phil Katz による、ZIP ファイル形式についてのドキュメントです。
PEP 0273 - Import Modules from Zip Archives
このモジュールの実装も行った、James C. Ahlstrom による PEP です。 Python 2.3 は PEP 273 の仕様に従っていますが、 Just van Rossum の書いた import フックによる実装を使っています。 import フックは PEP 302 で解説されています。
PEP 0302 - New Import Hooks
このモジュールを動作させる助けになっている import フックの追加を提案している PEP です。

このモジュールでは例外を一つ定義しています:

exception zipimport.ZipImporterError

zipimporter オブジェクトが送出する例外です。 ImportError のサブクラスなので、 ImportError としても捕捉できます。

31.3.1. 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 を送出します。

find_module(fullname[, path])

fullname に指定したモジュールを検索します。 fullname は完全指定の (ドット表記の) モジュール名でなければなりません。 モジュールが見つかった場合には zipimporter インスタンス自体を返し、 そうでない場合には None を返します。 path 引数は無視されます — この引数は importer プロトコルとの互換性を保つためのものです。

get_code(fullname)

fullname に指定したモジュールのコードオブジェクトを返します。 モジュールがない場合には ZipImportError を送出します。

get_data(pathname)

pathname に関連付けられたデータを返します。 該当するファイルが見つからなかった場合には IOError を送出します。

get_source(fullname)

fullname に指定したモジュールのソースコードを返します。 モジュールが見つからなかった場合には ZipImportError を送出します。 モジュールは存在するが、ソースコードがない場合には None を返します。

is_package(fullname)

fullname で指定されたモジュールがパッケージの場合に True を返します。 モジュールが見つからなかった場合には ZipImportError を送出します。

load_module(fullname)

fullname に指定したモジュールをロードします。 fullname は完全指定の (ドット表記の) モジュール名でなくてはなりません。 import 済みのモジュールを返します。 モジュールがない場合には ZipImportError を送出します。

archive

importer に紐付けられた ZIP ファイルのファイル名で、サブパスは含まれません。

prefix

ZIP ファイル中のモジュールを検索するサブパスです。 この文字列は ZIP ファイルの根を指している zipimporter オブジェクトでは空です。

アトリビュート archiveprefix とは、スラッシュでつなげると、 zipimporter コンストラクタに渡された元々の archivepath 引数と等しくなります。

31.3.2. 使用例

モジュールを ZIP アーカイブから import する例を以下に示します - zipimport モジュールが明示的に使われていないことに注意してください。

$ unzip -l /tmp/example.zip
Archive:  /tmp/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, '/tmp/example.zip')  # パス先頭に .zip ファイル追加
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'