我在Lambda
中有一个Python
函数,它使用了几个具有二元依赖关系的库:numpy
,scipy
,Pillow
等。过去,我已经在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
是我lib
中lambda.zip
文件夹中的文件。此文件夹包含多个.so
和.a
文件,我在汇集numpy
,scipy
,Pillow
等时在AWS Linux上构建了这些文件。
据我所知,这是numpy
的依赖。我不理解的部分是:我的函数在添加numpy
之前使用了libptf77blas.a.gz
(并且大概是grequests
。
所以我假设编译gevent
打破了我的其他binary
依赖库的依赖关系,或者gevent
本身需要libptf77blas.a.gz
并且对它发现的内容感到困惑。
我在ldd
个文件.so
上依赖gevent
运行,但没有一个引用libptf77blas.a.gz
。但是,我是一个编译新手,所以这很难确定。
我想实现并行上传Grequests
启用,但目前还不清楚如何解决这个问题,或者使用哪些替代库(我通常编写JS,因此Python是第二语言)。
答案 0 :(得分:2)
问题完全是一个无关紧要的用户错误 - 按照OP中的步骤进行操作,你应该没问题。
或者只使用grequests
I posted on github的副本。它是zip
grequests
,gevent
和greenlet
在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实例并像教程一样安装那里的东西。