2015-10-19 199 views
2

您好我打算使用AWS lambda,我需要打包我的依赖库。他们建议的方式是使用pip install --target将所有依赖关系加载到一个位置并在稍后进行捆绑。pip安装到目标目录失败

但是,我正在尝试使用PIL库来处理jpgs,我正在使用枕头,这是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使用C python库,例如_imaging.so,它们在本地库路径中再次链接库(默认情况下),并且不存在于lambda环境中。这里是如何看起来像我的机器上:

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

所以,当AWS会尽量import Imaging在你的Python拉姆达,它会抛出一个错误:"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)链接的共享库依赖于你的拉姆达代码相同的(相对)目录:

# 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/。我没有验证它。