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