pip安装到目标目录失败
问题描述:
您好我打算使用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/'
最后在目标目录中没有任何东西。
答
面对同样的问题,我没有考虑使用--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/
。我没有验证它。
在与'MySQL-python'相同的情况下得到相同的错误 –