如何在AWS Lambda上使用Grequests?

时间:2016-12-27 21:03:29

标签: python amazon-web-services aws-lambda gevent grequests

我在Lambda中有一个Python函数,它使用了几个具有二元依赖关系的库:numpyscipyPillow等。过去,我已经在Amazon Linux&部署到Lambda

我最近将Grequest添加到了一堆依赖项中,并且它抛出了与Grequest无关的错误。关于这个话题的Other questions导致了死胡同,所以把我的帽子放在戒指上。

第一个错误是一个简单的Grequests requires gevent或类似的东西。为了解决这个问题,我尝试在pip install gevent --no-binary :all:实例上运行Amazon Linux,将其与我的代码捆绑在一起并上传到Lambda。这对错误没有影响。

然后我从src repo下载了 gevent并使用make对其进行了编译(repo的README中的命令引发了错误我没有记录)。这产生了一个egg文件,我将其转换为whl文件&跑pip install gevent.whl -t .

我将生成的代码与lambda.zip捆绑在一起并上传。这导致新错误module initialization error: lib/libptf77blas.a.gz: invalid ELF header

libptf77blas.a.gz 是我liblambda.zip文件夹中的文件。此文件夹包含多个.so.a文件,我在汇集numpyscipyPillow等时在AWS Linux上构建了这些文件。

据我所知,这是numpy的依赖。我不理解的部分是:我的函数在添加numpy之前使用了libptf77blas.a.gz(并且大概是grequests

所以我假设编译gevent打破了我的其他binary依赖库的依赖关系,或者gevent本身需要libptf77blas.a.gz并且对它发现的内容感到困惑。

我在ldd个文件.so上依赖gevent运行,但没有一个引用libptf77blas.a.gz。但是,我是一个编译新手,所以这很难确定。

我想实现并行上传Grequests启用,但目前还不清楚如何解决这个问题,或者使用哪些替代库(我通常编写JS,因此Python是第二语言)。

2 个答案:

答案 0 :(得分:2)

问题完全是一个无关紧要的用户错误 - 按照OP中的步骤进行操作,你应该没问题。

或者只使用grequests I posted on github的副本。它是zip grequestsgeventgreenlet在Amazon Linux实例上编译的。它适用于我的Lambda Function就好了。

答案 1 :(得分:0)

正如other questions所述,您需要确保使用libev编译Amazon Linux Image和其他内容的二进制文件。基本上,你需要在运行Amazon Linux的机器上安装numpy和Grequests之类的东西,因为它们使用需要编译的C代码。

该问题中的tutorial link看起来非常适合从源代码构建内容,虽然比您需要的更多。

如果您是编译二进制文件的新手,那么您应该阅读一些关于make的内容,并查看一些示例,例如building curl。由于您使用的是亚马逊Linux,它使用的是yum,与CentOS非常相似。

可能能够在CentOS中的docker图像上的venv中安装numpy和Grequests,并从类似于教程的内容中拉出内容,但我先是继续使用亚马逊的图像启动EC2实例并像教程一样安装那里的东西。