我正在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使用我在libs目录中给出的libstdc++.so.6。
我认为我正确地链接了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
...你知道我这里漏掉了什么吗?
发布于 2019-02-14 15:17:43
不要使用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文件夹加载共享库。
https://stackoverflow.com/questions/54056161
复制相似问题