# 31.1. `zipimport` --- Zip アーカイブからモジュールを import する

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

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

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

アーカイブコメント付きの 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.1.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 に関連付けられたデータを返します。該当するファイルが見つからなかった場合には `OSError` を送出します。

    バージョン 3.3 で変更: 以前は `OSError` の代わりに `IOError` が送出されていました。

  `get_filename`(fullname)

    指定されたモジュールが import された場合、そのモジュールに設定した `__file__` の値を返します。モジュールが見つからない場合、 `ZipImportError` を送出します。

    バージョン 3.1 で追加.

  `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.1.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'