# 31.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 を行わせたりできます。例えば、 `example.zip/lib/` のように指定すると、アーカイブ中の `lib/` サブディレクトリ下だけから import を行います。

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

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

アーカイブコメント付きの ZIP アーカイブは現在のところサポートされていません。

参考

PKZIP Application Note

  ZIP ファイルフォーマットおよびアルゴリズムを作成した Phil Katz によるドキュメント。

PEP 273 - Zip アーカイブからモジュールをインポートする

  このモジュールの実装も行った、James C. Ahlstrom による PEP です。Python 2.3 は PEP 273 の仕様に従っていますが、Just van Rossum の書いた import フックによる実装を使っています。import フックは PEP 302 で解説されています。

PEP 302 - 新たなインポートフック

  このモジュールを動作させる助けになっている import フックの追加を提案している PEP です。

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

exception `zipimport.``ZipImportError`

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

## 31.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 引数と等しくなります。

## 31.4.2. 例

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

    $ unzip -l example.zip
    Archive:  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, 'example.zip')  # Add .zip file to front of path
    >>> import jwzthreading
    >>> jwzthreading.__file__
    'example.zip/jwzthreading.py'