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--无二进制文件:全部:
完成,无错误。但是,将结果文件打包到mylambda.zip
中并不能解决原始错误。我将编辑我的OP以反映这一点,但正是从src
构建gevent
让我从genericGrequests requires gevent
error到ELF头
error(progress?)即使这是你自己的答案,你也应该接受,因为这是正确的答案。我知道我正在回复一篇已有一年历史的帖子/答案,但如果你碰巧有同样类型的Python3.6:d zip文件,我将不胜感激