2015-06-12 33 views
10

Na małym osadzonym urządzeniu linuksowym z ograniczoną przestrzenią próbuję umieścić dużą bibliotekę [10 Mb] Amazon (AWS) BotoCore (https://github.com/boto/botocore) w pliku zip, aby ją skompresować, a następnie zaimportować w moich skryptach Pythona używających zipimport, jak opisano w PEP273 (https://www.python.org/dev/peps/pep-0273/).Python PEP 273 i Amazon BotoCore

zmodyfikowałem mój skrypt posiadać następujące linie na początku:

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

Witryna-pakiety plik ZIP ma tylko botocore w nim i sam katalog site-packages ma inne moduły używam, ale z wyłączeniem botocore, w nim.

Oto lista tego katalogu:

/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 

A oto treść tego na kartę SD: enter image description here

Moim problemem jest to, że mogę importować boto3 i import botocore tylko znaleźć, ale kiedy staram się korzystać z niektórych metod API w nim zawartych, otrzymuję wyjątki tak:

>> Unknown component: enpoint_resolver 

lub

Po usunięciu pliku zip po rozpakowaniu go w katalogu lokacji-paczek i ponownym uruchomieniu komputera - mój skrypt działa poprawnie.

Jak mogę wykorzystać import zipfile do skompresowania tej ogromnej biblioteki? Dzięki!

+1

Omg, oferując cały twój przedstawiciel! : O – Zizouz212

+2

Co to jest rep, gdy chcesz odpowiedzi? – PhilBot

+1

Chyba ... ale wciąż! – Zizouz212

Odpowiedz

7

Niestety, to po prostu nie zadziała.

PEP 273 wymaga od autorów bibliotek przestrzegania pewnych zasad, których ten pakiet nie zawiera. W szczególności jest to makes use of __file__ zamiast pkgutil.get_data() lub równoważny API. W rezultacie pliki muszą faktycznie istnieć w systemie plików.

Możesz spróbować użyć FUSE, aby zamontować plik .zip w systemie plików, tak aby wyglądał na Pythona tak, jakby był nieskompresowany, bez zajmowania całego miejsca na dysku. Wystarczy przejrzeć Google, wymyśliłem fuse-zip, który wygląda na odpowiedni. Będziesz chciał przeprowadzić testy porównawcze, aby upewnić się, że działa dobrze w twoim systemie.