この 2 つの側面をどのように組み合わせることができるかを理解しようとしています。
- ネイティブ ファイル システムでのリソースの読み込み
- 圧縮ファイルにパッケージ化
zipimport に関する簡単なチュートリアルを読む: http://www.doughellmann.com/PyMOTW/zipimport/
次の例が表示されます。
import sys
sys.path.insert(0, 'zipimport_example.zip')
import os
import zipimport
importer = zipimport.zipimporter('zipimport_example.zip')
module = importer.load_module('example_package')
print module.__file__
print module.__loader__.get_data('example_package/README.txt')
__file__ の出力は「zipimport_example.zip/example_package/__init__.pyc」だと思います
中からの見え方は要チェックです。
しかし、私たちはいつでも次のようなことをすることができます:
if ".zip" in example_package.__file__:
...
load using get_data
else:
load by building the correct file path
[編集:] 私は例をもう少し良くしようとしました。
パッケージが圧縮ファイルとしてインポートされると、2 つのことが起こります。
- __file__ のパスには「.zip」が含まれています。
- __loader__ は名前空間で利用可能です
これら 2 つの条件が満たされている場合、パッケージ内で次のことができます。
print __loader__.get_data(os.path.join('package_name','README.txt'))
それ以外の場合、モジュールは正常にロードされ、通常の方法でファイルをロードできます。