1

我有一个Lambda函数,Python它使用了几个具有二进制依赖关系的库:numpyscipyPillow等。过去,我已经成功地将它们编译到Amazon Linux& 部署到Lambda.

不过,我最近添加Grequest到一堆依赖项中,它抛出的错误似乎与Grequest. 关于这个话题的其他问题导致了死胡同,所以把我的帽子放在戒指上。

第一个错误是简单的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.gzlib我的文件夹中的一个文件lambda.zip。该文件夹包含几个文件.so.a我在 AWS Linux 上组装、、、等时构建了numpy这些scipy文件Pillow

据我所知,这是对numpy. 我不明白的部分是:我使用的函数numpy(并且libptf77blas.a.gz在添加grequests.

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

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

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

4

2 回答 2

3

这个问题完全是一个无关紧要的愚蠢的用户错误——按照 OP 中的步骤,你应该没问题。

grequests 或者只是使用我在 github 上发布的副本。它是在 Amazon Linux 实例上编译的zipwith grequestsgevent和。greenlet它在我的工作中Lambda Function很好。

于 2016-12-28T00:37:49.347 回答
0

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

该问题中的教程链接看起来非常适合从源代码构建东西,尽管比您需要的要多一点。

如果您对编译二进制文件不熟悉,您应该阅读一些关于 make 的内容,并查看一些示例,例如构建 curl。由于您使用的是 Amazon Linux,因此它使用 yum 并且与 CentOS 非常相似。

也许可以在 CentOS 中的 docker 映像上的 venv 中安装 numpy 和 Grequests 并从类似于教程的内容中压缩内容,但我首先会使用亚马逊的映像启动 EC2 实例并安装东西就像教程一样。

于 2016-12-27T21:35:02.443 回答