当前位置: 代码迷 >> python >> 点安装到目标目录失败
  详细解决方案

点安装到目标目录失败

热度:79   发布时间:2023-06-13 14:04:01.0

嗨,我打算使用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/'

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

面对相同的问题,尽管它可能无法解决问题,但我并未考虑使用--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/中。 我没有验证。

  相关解决方案