【问题标题】:How do I use Grequests on AWS Lambda?如何在 AWS Lambda 上使用 Grequests?
【发布时间】:2016-12-28 08:37:49
【问题描述】:

我在Python 中有一个Lambda 函数,它使用了几个具有二进制依赖关系的库:numpyscipyPillow 等。过去,我在Amazon Linux &部署到Lambda

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

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

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

我将生成的代码与我的lambda.zip 捆绑在一起并上传。这导致了一个新错误module initialization error: lib/libptf77blas.a.gz: invalid ELF header

libptf77blas.a.gz 是我的lambda.ziplib 文件夹中的一个文件。这个文件夹包含几个.so.a文件,我在AWS Linux上组装numpyscipyPillow等时构建的。

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

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

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

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

【问题讨论】:

    标签: python amazon-web-services aws-lambda gevent grequests


    【解决方案1】:

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

    或者只使用grequests I posted on github 的副本。它是在 Amazon Linux 实例上编译的带有 grequestsgeventgreenletzip。它在我的Lambda Function 中工作得很好。

    【讨论】:

    • 你应该接受这个答案,即使它是你自己的,因为它是正确的。
    • 我知道我正在回复一年前的帖子/答案,但如果您碰巧有 Python 3.6 的相同类型的 zip 文件,我将不胜感激:D
    【解决方案2】:

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

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

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

    可能能够在 CentOS 中的 docker 映像上的 venv 中安装 numpy 和 Grequests 并从类似于教程的内容中压缩内容,但我首先会选择使用亚马逊的镜像启动一个 EC2 实例并像教程一样在那里安装东西。

    【讨论】:

    • 谢谢。正如我在第一段中指出的那样,我之前在 Amazon Linux 上编译了许多库,包括 numpy,直到添加 grequests,在我的 Lambda 函数中运行良好。我尝试了您之前链接的教程,但是据我所知,gevent 库没有遵循相同的make 步骤。我能够将makegevent repo 转换为egg,将其转换为whl,然后从whl 安装(在 AWS Linux 上),但遇到与我的 OP 详细信息类似的错误。 gevents 使用较少涉及的过程也会失败,例如 pip install --no-binaries :all:
    • 我很抱歉。我清楚地浏览了第一段的大部分内容。
    • np——老实说,我需要学习编写更简洁的 SO 问题。期望人们从我流畅的散文中挖掘实质内容是不合理的:)
    • 澄清一下,运行 pip install grequests,并在 EC2 实例上测试 grequests 库本身也会产生此错误,还是仅在 Lambda 上?
    • 原来的lambda 错误类似于“Grequests requires gevent”,所以在 Amazon Linux 上我只安装了gevent。它一开始就失败了,正如github issue 中所述,但在一些差异接近之后,命令pip install gevent -t . --no-binary :all: 完成而没有错误。但是,将生成的文件打包到我的lambda.zip 并不能解决原始错误。我将编辑我的 OP 以反映这一点,但它是从 src 构建 gevent 使我从通用 Grequests requires gevent 错误到 ELF header 错误(进度?)
    猜你喜欢
    • 2020-04-21
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多