Python 如何在AWS Lambda上使用Grequests?

Python 如何在AWS Lambda上使用Grequests?,python,amazon-web-services,aws-lambda,gevent,grequests,Python,Amazon Web Services,Aws Lambda,Gevent,Grequests,我在Python中有一个Lambda函数,它使用了几个具有二进制依赖关系的库:numpy、scipy、Pillow,等等。过去,我在amazonlinux上成功编译了它们并部署到Lambda 不过,我最近在依赖项堆中添加了Grequest,它抛出的错误似乎与Grequest没有直接关系。在这个话题上,我已经走到了死胡同,所以我要把我的帽子戴在戒指上 第一个错误是一个简单的Grequests requires gevent或类似的错误。为了解决这个问题,我尝试在amazonlinux实例上运行pi

我在
Python
中有一个
Lambda
函数,它使用了几个具有二进制依赖关系的库:
numpy
scipy
Pillow
,等等。过去,我在
amazonlinux
上成功编译了它们并部署到
Lambda

不过,我最近在依赖项堆中添加了
Grequest
,它抛出的错误似乎与
Grequest
没有直接关系。在这个话题上,我已经走到了死胡同,所以我要把我的帽子戴在戒指上

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

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

我将生成的代码与我的
lambda.zip绑定并上传。这导致了一个新的错误:
模块初始化错误:lib/libptf77blas.a.gz:ELF头无效

libptf77blas.a.gz
是我的
lambda.zip中
lib
文件夹中的一个文件。这个文件夹包含几个
.so
.a
文件,这些文件是我在AWS Linux上组装
numpy
scipy
枕头
时构建的

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

因此,我假设编译
gevent
时会破坏我的另一个
binary
依赖lib的依赖关系,或者
gevent
本身需要
libptf77blas.a.gz
,并且对它的发现感到困惑

我在
上运行了
ldd
。因此
文件
gevent
取决于,但没有引用
libptf77blas.a.gz
。但是,我是一名编译新手,所以这很难得出结论

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

如前所述,您需要确保的二进制文件和其他东西是使用编译的。基本上,您需要在运行的机器上安装numpy和Grequests等东西,因为它们使用需要编译的C代码

这个问题中的问题看起来非常适合从源代码构建东西,尽管比您需要的要多一些

如果你是编译二进制文件的新手,你应该读一点关于make的知识,看看下面的例子。因为你在Amazon Linux上,它使用的是yum,与CentOS非常相似


你也许可以在CentOS的docker映像上安装venv中的numpy和Grequests,并将其内容压缩到类似于教程的内容,但我首先要使用amazon的映像启动一个EC2实例,并像教程一样在那里安装这些东西。

这个问题完全是一个愚蠢的用户错误无关的事情——按照OP中的步骤去做,你应该会没事的


或者只使用在Amazon Linux实例上编译的
grequests
。它是一个
zip
,带有
grequests
gevent
、和
greenlet
。它在我的
Lambda函数中运行得很好。

谢谢。正如我在第一段中所指出的,我以前在Amazon Linux上编译过许多库e、 包括
numpy
,在添加
grequests
之前,它在我的
Lambda
函数中运行良好。我尝试了您之前链接的教程,但是
gevent
库没有遵循相同的
make
步骤,据我所知。我能够
make
gevent
回购到
egg
,将其转换为
whl
,然后从
whl
安装(在AWS Linux上),但遇到了与我的OP详细信息类似的错误。
gevents
也无法使用较少涉及的过程,例如
pip安装--无二进制文件:all:
。我很抱歉。我清楚地浏览了第一段的大部分内容。np--老实说,我需要学习编写更简洁的SO问题。期望人们挖掘ut我流畅的文章中的实质内容:)只是澄清一下,运行
pip安装grequests
,并在EC2实例上测试grequests库本身也会产生此错误,还是仅在Lambda上产生此错误?原始
Lambda
错误类似于“grequests需要gevent”,因此,在AmazonLinux上,我只安装了
gevent
。正如本文所述,它最初失败了,但在采用了一些不同的方法之后,命令
pip install gevent-t--无二进制文件:全部:
完成,无错误。但是,将结果文件打包到my
lambda.zip
中并不能解决原始错误。我将编辑我的OP以反映这一点,但正是从
src
构建
gevent
让我从generic
Grequests requires gevent
error到
ELF头
error(progress?)即使这是你自己的答案,你也应该接受,因为这是正确的答案。我知道我正在回复一篇已有一年历史的帖子/答案,但如果你碰巧有同样类型的Python3.6:d zip文件,我将不胜感激