问题描述
嗨,我打算使用AWS lambda来打包我的依赖库。
他们建议的方式是使用pip install --target
将所有依赖项加载到一个位置,然后将它们捆绑在一起。
但是,我正在尝试使用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/'
最后,目标目录中没有任何内容。
1楼
面对相同的问题,尽管它可能无法解决问题,但我并未考虑使用--target
。
原因是因为PIL使用的是C python库,例如_imaging.so
,它们再次链接在一起(默认情况下)位于本地库路径中的库,而这些库在lambda环境中不存在。
这是我的机器上的样子:
$ ldd PIL/_imaging.so
...
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8
...
因此,当AWS尝试在您的python lambda中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机器上工作):强制pip(本质上是gcc)将共享库依赖项链接到lambda代码的同一(相对)目录中:
# 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
文件压缩到lambda包中(当然,请保留相同的文件树)。
而已。
注意:如果要保持根目录的整洁,可以将so
文件部署到virtualenv的lib/
中。
我没有验证。