30.4. zipimport — Zip アーカイブからモジュールを import する — Python 2.7ja1 documentation

### ナビゲーション

- 索引
- モジュール |
- 次へ |
- 前へ |
- Python 2.7ja1 documentation »
- Python 標準ライブラリ »
- 30. モジュールのインポート »

# 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'

### ナビゲーション

- 索引
- モジュール |
- 次へ |
- 前へ |
- Python 2.7ja1 documentation »
- Python 標準ライブラリ »
- 30. モジュールのインポート »