# `zipimport` --- Zip アーカイブからモジュールをインポートする

ソースコード: Lib/zipimport.py

This module adds the ability to import Python modules (`*.py`, `*.pyc`) and packages from ZIP-format archives. It is usually not needed to use the `zipimport` module explicitly; it is automatically used by the built-in `import` mechanism for `sys.path` items that are paths to ZIP archives.

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

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

バージョン 3.15 で変更: Zstandard (zstd) compressed zip file entries are supported.

バージョン 3.13 で変更: ZIP64 is supported

バージョン 3.8 で変更: 以前は、アーカイブコメント付きの ZIP アーカイブはサポートされていませんでした。

参考

PKZIP Application Note

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

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

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

`importlib` - `import` の実装

  Package providing the relevant protocols for all importers to implement.

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

exception zipimport.ZipImportError

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

## 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` を送出します。

  バージョン 3.12 で変更: Methods `find_loader()` and `find_module()`, deprecated in 3.10 are now removed. Use `find_spec()` instead.

  create_module(spec)

    Implementation of `importlib.abc.Loader.create_module()` that returns `None` to explicitly request the default semantics.

    Added in version 3.10.

  exec_module(module)

    `importlib.abc.Loader.exec_module()` の実装です。

    Added in version 3.10.

  find_spec(fullname, target=None)

    `importlib.abc.PathEntryFinder.find_spec()` の実装です。

    Added in version 3.10.

  get_code(fullname)

    fullname に指定したモジュールのコードオブジェクトを返します。モジュールがインポートできなかった場合には `ZipImportError` を送出します。

  get_data(pathname)

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

    バージョン 3.3 で変更: 以前は `IOError` が送出されました; それは現在 `OSError` のエイリアスです。

  get_filename(fullname)

    指定されたモジュールが import された場合、そのモジュールに設定した `__file__` の値を返します。モジュールがインポートできなかった場合、 `ZipImportError` を送出します。

    Added in version 3.1.

  get_source(fullname)

    fullname で指定されたモジュールのソースコードを返します。モジュールが見つからない場合、`ZipImportError` を送出します。アーカイブにはモジュールがあるもののソースコードがない場合、 `None` を返します。

  is_package(fullname)

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

  invalidate_caches()

    Clear out the internal cache of information about files found within the ZIP archive.

    Added in version 3.10.

  archive

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

  prefix

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

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

## 使用例

Here is an example that imports a module from a ZIP archive - note that the `zipimport` module is not explicitly used.

    $ unzip -l example_archive.zip
    Archive:  example_archive.zip
      Length     Date   Time    Name
     --------    ----   ----    ----
         8467  01-01-00 12:30   example.py
     --------                   -------
         8467                   1 file

    >>> import sys
    >>> # Add the archive to the front of the module search path
    >>> sys.path.insert(0, 'example_archive.zip')
    >>> import example
    >>> example.__file__
    'example_archive.zip/example.py'