我正在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
文件,然后有两个子目录,分别名为libs
和site-packages
。 Libs
包含诸如liblapack.so
,libquadmath.so
,libstdc++.so.6
等文件。
然后,site-packages
目录包含我对python代码的所有依赖关系-CV
,Numpy
和Dlib
。我已经在桌子上撞了几天。为了我的一生,我不知道如何指示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
...
有什么想法我在这里想念吗?
答案 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
文件夹中加载共享库。