目次

前のトピックへ

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

次のトピックへ

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

このページ

30.4. 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 ファイルが置き換えられてしまうことになり、あまり起こりそうにない状況だからです。

アーカイブコメント付きの ZIP アーカイブは現在のところ未サポートです。

参考

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

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

exception zipimport.ZipImporterError

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

30.4.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_filename(fullname)

指定されたモジュールが import さた場合、そのモジュールに設定した __file__ の値を返します。モジュールが見つからなかった場合は ZipImportError 例外を発生させます。

バージョン 2.7 で追加.

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 オブジェクトでは空です。

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

30.4.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'