Python PEP 273 和亚马逊 BotoCore
Python PEP 273 and Amazon BotoCore
在 Linux 有限 space 的小型嵌入式 Linux 设备上,我正在尝试放置大型 [10 Mb] 亚马逊 (AWS) BotoCore 库 (https://github.com/boto/botocore) in a zip file to compress it and then import it in my Python Scripts using zipimport as described in PEP273 (https://www.python.org/dev/peps/pep-0273/)。
我修改了我的脚本以在开头包含以下几行:
## 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 导入来压缩这个巨大的库?谢谢!
不幸的是,这行不通。
PEP 273 要求库作者遵守某些规则,而这个包不需要。特别是,它 makes use of __file__
rather than pkgutil.get_data()
或等效的 API。因此,文件必须实际存在于文件系统中。
您可以尝试使用 FUSE 将 .zip 文件装载到文件系统中,这样 Python 就好像它是未压缩的,实际上不会占用所有磁盘 space。随便翻了下Google,就想到了fuse-zip,貌似还可以吧。您需要 运行 一些基准测试以确保它在您的系统上运行良好。
在 Linux 有限 space 的小型嵌入式 Linux 设备上,我正在尝试放置大型 [10 Mb] 亚马逊 (AWS) BotoCore 库 (https://github.com/boto/botocore) in a zip file to compress it and then import it in my Python Scripts using zipimport as described in PEP273 (https://www.python.org/dev/peps/pep-0273/)。
我修改了我的脚本以在开头包含以下几行:
## 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 导入来压缩这个巨大的库?谢谢!
不幸的是,这行不通。
PEP 273 要求库作者遵守某些规则,而这个包不需要。特别是,它 makes use of __file__
rather than pkgutil.get_data()
或等效的 API。因此,文件必须实际存在于文件系统中。
您可以尝试使用 FUSE 将 .zip 文件装载到文件系统中,这样 Python 就好像它是未压缩的,实际上不会占用所有磁盘 space。随便翻了下Google,就想到了fuse-zip,貌似还可以吧。您需要 运行 一些基准测试以确保它在您的系统上运行良好。