10

スペースが限られた小さな組み込み Linux デバイスで、大きな [10 Mb] Amazon (AWS) BotoCore ライブラリ ( https://github.com/boto/botocore ) を zip ファイルに配置して圧縮してからインポートしようとしています。 PEP273 ( https://www.python.org/dev/peps/pep-0273/ ) で説明されているように、zipimport を使用して Python スクリプトでそれを実行します。

スクリプトを変更して、最初に次の行を追加しました。

## Use zip imports
import sys
sys.path.insert(0, '/usr/lib/python2.7/site-packages/site-packages.zip') 

site-packages zip ファイルには botocore のみが含まれており、site-packages ディレクトリ自体には、使用している他のモジュールが含まれていますが、botocore は含まれていません。

そのディレクトリのリストは次のとおりです。

    /usr/lib/python2.7/site-packages >> ls -rlt
    total 1940
-rw-rw-r-- 1 root root   32984 Jun  8 12:22 six.pyc
-rw-r--r-- 1 root root     119 Jun 11 07:43 README
drwxrwxr-x 2 root root    4096 Jun 11 07:43 requests-2.4.3-py2.7.egg-info
drwxrwxr-x 2 root root    4096 Jun 11 07:43 six-1.9.0-py2.7.egg-info
drwxrwxr-x 2 root root    4096 Jun 11 07:43 python_dateutil-2.4.2-py2.7.egg-info
drwxrwxr-x 2 root root    4096 Jun 11 07:43 jmespath-0.7.0-py2.7.egg-info
-rw-rw-r-- 1 root root    2051 Jun 11 07:44 pygtk.pyc
-rw-rw-r-- 1 root root    1755 Jun 11 07:44 pygtk.pyo
-rw-rw-r-- 1 root root       8 Jun 11 07:44 pygtk.pth
drwxrwxr-x 2 root root    4096 Jun 11 07:44 futures-2.2.0-py2.7.egg-info
drwxrwxr-x 3 root root    4096 Jun 11 07:44 gtk-2.0
drwxrwxr-x 3 root root    4096 Jun 11 07:44 requests
drwxrwxr-x 3 root root    4096 Jun 11 07:44 dbus
drwxrwxr-x 3 root root    4096 Jun 11 07:44 dateutil
drwxrwxr-x 2 root root    4096 Jun 11 07:44 jmespath
drwxrwxr-x 3 root root    4096 Jun 11 07:44 concurrent
drwxrwxr-x 2 root root    4096 Jun 11 07:44 futures
drwxrwxr-x 2 root root    4096 Jun 12 10:42 gobject
drwxrwxr-x 2 root root    4096 Jun 12 10:42 glib
-rwxr-xr-x 1 root root    5800 Jun 12 10:42 _dbus_glib_bindings.so
-rwxr-xr-x 1 root root   77680 Jun 12 10:42 _dbus_bindings.so
-rwxr-xr-x 1 root root 1788623 Jun 12 11:39 site-packages.zip

そして、これがそのzipファイルの内容です: ここに画像の説明を入力

私の問題は、boto3 をインポートして botocore をインポートできることですが、そこに含まれるいくつかの API メソッドを使用しようとすると、次のような例外が発生します。

>> Unknown component: enpoint_resolver

また

>> Unable to load data for: aws/_endpoints!

site-packages ディレクトリで解凍した後に zip ファイルを削除して再起動すると、スクリプトは正常に動作します。

この巨大なライブラリを圧縮するために zipfile インポートをどのように活用できますか? ありがとう!

4

1 に答える 1

7

残念ながら、これだけではうまくいきません。

PEP 273 では、ライブラリの作成者が特定の規則に従う必要がありますが、このパッケージではそれが行われていません。特に、同等の APIではなく、または同等の APIを使用します。__file__pkgutil.get_data()その結果、ファイルはファイルシステムに実際に存在する必要があります。

FUSE を使用して .zip ファイルをファイル システムにマウントすると、Python には圧縮されていないように見え、実際にディスク スペースをすべて占有することはありません。Google で調べたところ、適切であると思われるfuse-zipを思いつきました。システムで適切に動作することを確認するために、いくつかのベンチマークを実行する必要があります。

于 2015-06-15T14:12:47.763 に答える