pip install到目标目录失败

时间:2015-10-19 21:28:58

标签: python virtualenv python-imaging-library pillow

您好我计划使用AWS lambda,我需要打包我的依赖库。他们建议的方法是使用pip install --target将所有依赖项加载到一个位置并在以后捆绑它们。

但是,我正在尝试使用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/'

最后目标目录中没有任何内容。

1 个答案:

答案 0 :(得分: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在您的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/。我没有验证它。