[英]How do I use Grequests on AWS Lambda?
我在Python
中有一个Lambda
函数,该函数使用几个具有二进制依赖性的库: numpy
, scipy
, Pillow
等。过去,我已经在Amazon Linux
上成功编译了它们并将其部署到Lambda
。
不过,我最近将Grequest
添加到了一堆依赖项中,并且它抛出的错误似乎与Grequest
。 关于这个话题的其他问题导致了死胡同,所以我把帽子戴上了。
第一个错误是简单的Grequests requires gevent
或类似的东西。 为了解决这个问题,我尝试在Amazon Linux
实例上运行pip install gevent --no-binary :all:
将其与我的代码捆绑在一起并上传到Lambda。 这对错误没有影响。
然后,我从gevent
库下载了src
并使用make
对其进行了编译(存储库README中的命令引发了我未记录的错误)。 这产生了一个egg
文件,我将其转换为whl
文件并运行pip install gevent.whl -t .
。
我将生成的代码与lambda.zip
捆绑在一起并上传了。 这导致了一个新错误 : module initialization error: lib/libptf77blas.a.gz: invalid ELF header
libptf77blas.a.gz
是我的lambda.zip
中的lib
文件夹中的文件。 此文件夹包含几个.so
和.a
文件,这些文件是我在组装numpy
, scipy
, Pillow
等时在AWS Linux上构建的。
据我所知,这是numpy
的依赖项。 我不明白的部分是:我的函数使用numpy
(大概libptf77blas.a.gz
在添加grequests
之前就grequests
。
因此,我假设有关编译gevent
打破了我其他与binary
相关的lib的依赖关系,或者gevent
本身需要libptf77blas.a.gz
并对其发现的内容感到困惑。
我在gevent
依赖的.so
文件上运行了ldd
,但没有一个引用libptf77blas.a.gz
。 但是,我是一位正在编译的新手,所以这几乎没有定论。
我想实现Grequests
启用的并行上载,但尚不清楚如何解决此问题,或不清楚要使用哪个替代库(我通常写JS,因此Python是第二语言)。
问题完全是与无关的用户造成的愚蠢用户错误-按照OP中的步骤操作,您应该会很好。
或者只是使用我在github上发布的grequests
的副本。 这是一个zip
其中grequests
在Amazon Linux实例上编译的grequests
, gevent
和greenlet
。 它可以在我的Lambda Function
正常工作。
正如其他问题所述,您需要确保使用Amazon Linux Image编译libev等二进制文件。 基本上,您需要在运行Amazon Linux的计算机上安装numpy和Grequests之类的东西,因为它们使用需要编译的C代码。
该问题中的教程链接对于从源代码构建事物看起来非常不错,尽管比您需要的更多。
如果您不熟悉编译二进制文件,则应阅读一些有关make的知识,并查看一些示例,例如构建curl 。 由于您使用的是Amazon Linux,因此它使用yum,并且与CentOS非常相似。
您也许可以通过在CentOS的docker映像上的venv上的venv中安装numpy和Grequests并将其内容压缩成类似于本教程的方式来摆脱,但是我首先要使用Amazon的映像启动EC2实例并安装东西就像本教程一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.