"zipimport" — Zip アーカイブからモジュールを import する
********************************************************

バージョン 2.3 で追加.

This module adds the ability to import Python modules ("*.py",
"*.py[co]") 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 を行います。

Any files may be present in the ZIP archive, but only files ".py" and
".py[co]" are available for import.  ZIP import of dynamic modules
(".pyd", ".so") is disallowed. Note that if an archive only contains
".py" files, Python will not attempt to modify the archive by adding
the corresponding ".pyc" or ".pyo" file, meaning that if a ZIP archive
doesn’t contain ".pyc" files, importing may be rather slow.

Using the built-in "reload()" function will fail if called on a module
loaded from a ZIP archive; it is unlikely that "reload()" would be
needed, since this would imply that the ZIP has been altered during
runtime.

アーカイブコメント付きの 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" としても捕捉できます。


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)

      Return the data associated with *pathname*. Raise "IOError" if
      the file wasn’t found.

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


使用例
======

モジュールを 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'
