2015-10-19 6 views
2

Привет, я планирую использовать AWS лямбда, где мне нужно хорошо упаковать библиотеки зависимостей. Способ, который они предлагают, заключается в использовании pip install --target для загрузки всех зависимостей в одно место и последующего связывания их позже.pip install to target directory fail

Тем не менее, я пытаюсь использовать библиотеку PIL для обработки jpg, где я использую подушку, которая является активно поддерживаемой вилкой PIL.

Это то, что я сделал, чтобы заставить его работать:

$ virtualenv env 
$ source env/bin/activate 
(env)$ pip install pillow 
... 
    changing mode of /home/~/lambdaEnv/bin/pilconvert.py to 775 
    changing mode of /home/~/lambdaEnv/bin/pilprint.py to 775 
Successfully installed pillow-3.0.0 
(env)$ python 
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from PIL import Image 
>>> 

И это сработало идеально, однако, когда я использую target это ошибочный в странным образом. может ли кто-нибудь помочь мне в этом?

... 
changing mode of /tmp/tmpbbKMTP/bin/pilconvert.py to 775 
    changing mode of /tmp/tmpbbKMTP/bin/pilprint.py to 775 
Successfully installed pillow-3.0.0 
Exception: 
Traceback (most recent call last): 
    File "/home/~/lambdaEnv/lib/python2.6/site-packages/pip/basecommand.py", line 215, in main 
    status = self.run(options, args) 
    File "/home/~/lambdaEnv/lib/python2.6/site-packages/pip/commands/install.py", line 390, in run 
    for item in os.listdir(lib_dir): 
OSError: [Errno 2] No such file or directory: '/tmp/tmpbbKMTP/lib/python/' 

И, в конце концов, в целевой директории ничего нет.

+0

получение одинаковой ошибки в той же ситуации с 'MySQL-python' –

ответ

0

Опасаясь этой же проблемы, я не рассматривал использование --target, хотя, вероятно, это не решит проблему. Причина в том, что PIL использует библиотеки python C, такие как _imaging.so, которые снова связаны с библиотеками, расположенными (по умолчанию) в вашем пути к локальной библиотеке, и не присутствуют в среде лямбда. Вот как это выглядит на моей машине:

$ ldd PIL/_imaging.so 
... 
    libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 
... 

Итак, когда AWS будет пытаться import Imaging в вашем питона лямбда, он выдаст сообщение об ошибке: "errorMessage": "Unable to import module 'handler'" с указанием причины в журнале:

START RequestId: GUID-GUID-GUID Version: $LATEST 
Unable to import module 'handler': libjpeg.so.8: cannot open shared object file: No such file or directory 

Вот что вы можете сделать, чтобы преодолеть его (работал на моей машине Ubuntu): применять пип (по существу, GCC), чтобы связать разделяемых библиотек зависимостей в одной и той же (относительно) директории вашего кода лямбда:

# in your virtualenv directory: 
ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so.8 libjpeg.so.8 
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so.6 libfreetype.so.6 
ln -s /lib/x86_64-linux-gnu/libpng12.so.0 libpng12.so.0 
source bin/activate 
# Set LD_LIBRARY_PATH to search libraries in the current folder 
LD_LIBRARY_PATH=. 
export LD_LIBRARY_PATH; pip install Pillow 

Yon теперь может проверять местоположение зависимостей на ldd lib/python2.7/site-packages/PIL/*so. Убедитесь, что вы получили, например, libjpeg.so.8 => ./libjpeg.so.8 (0x00007fa115985000).

Вам тогда понадобится закрепить все файлы so в корневом каталоге, в лямбда-пакет (конечно же, сохранить одно и то же дерево файлов). Вот и все.

Примечание. Если вы хотите, чтобы ваш корневой каталог был более чистым, вы, вероятно, можете развернуть файлы so на lib/ вашего виртуального пользователя. Я не проверял.