无法在AWS Lambda中加载dlib

时间:2019-01-05 20:53:12

标签: python aws-lambda dlib

我正在AWS Lambda中创建一个使用DLIB包的函数。我在本地运行良好,然后确保我正确地编译了二进制文件,我基于AMI information given by Amazon创建了一个EC2实例,但是我似乎无法正确打包依赖项。

这是我尝试测试功能时从AWS Lambda收到的错误:

Unable to import module 'lambda_function': /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /var/task/site-packages/dlib.cpython-36m-x86_64-linux-gnu.so)

在我的软件包中(在S3中保持49mb的大小),我有lambda_function.py文件,然后有两个子目录,分别名为libssite-packagesLibs包含诸如liblapack.solibquadmath.solibstdc++.so.6等文件。

然后,site-packages目录包含我对python代码的所有依赖关系-CVNumpyDlib。我已经在桌子上撞了几天。为了我的一生,我不知道如何指示lambda使用我在libstdc++.so.6目录中给出的libs

我认为我在lambda_function.py内正确链接了所有软件包

import sys
import os

# Import installed packages (in site-packages and lib)
CWD = os.path.dirname(os.path.realpath(__file__))

site_pkgs = os.path.join(CWD, "site-packages")
lib_pkgss = os.path.join(CWD, "libs")

sys.path.append(site_pkgs)
sys.path.append(lib_pkgss)

import json
import cv2
import numpy as np
import dlib
import boto3
...

有什么想法我在这里想念吗?

1 个答案:

答案 0 :(得分:0)

不要使用site-packages文件夹。而是将文件压缩到site-packages文件夹和完整的lib文件夹中,然后将其上传到AWS lambda(通过S3存储桶)。那应该可以了。对我有用的文件夹结构是这个。

├── dlib.cpython-36m-x86_64-linux-gnu.so
├── easy_install.py
├── lambda_function.py
├── lib
│   ├── libgfortran.so.3
│   ├── libopenblas.so.0
│   └── libquadmath.so.0          # only these three are needed.
├── pip
├── pip-10.0.1.dist-info
├── pkg_resources
├── setuptools
├── setuptools-39.0.1.dist-info
├── numpy
└── any other packages you might have(like scikit opencv etc)

压缩此文件夹,然后将其上传到lambda。您不需要像使用sys.path.append()os.path.join()那样在代码内部手动链接,因此删除这些行。 AWS lambda将自动从lib文件夹中加载共享库。