【问题标题】:AWS Lambda not importing AsyncioAWS Lambda 不导入 Asyncio
【发布时间】:2020-04-20 03:14:46
【问题描述】:

所以我正在制作一个用于调用 Reddit API 的应用程序,似乎 Lambda 不喜欢我如何导入 asyncio。我使用“pip install asyncio -t”在包文件夹中安装了 asyncio。然后用我的项目文件压缩那个文件夹。我正在项目文件中导入 asyncio (import asyncio)。但是,每次我尝试在 Alexa 开发者控制台中测试我的 Alexa 应用程序时,应用程序在我摆脱 import 语句之前不会运行。

这是我尝试测试时收到的消息:

{ “errorMessage”:“模块‘reddit_alexa_py’中的语法错误:无效 语法(base_events.py,第 296 行)”、“errorType”: “Runtime.UserCodeSyntaxError”,“stackTrace”:[ " File \"/var/task/asyncio/base_events.py\" 第 296 行\n future = tasks.async(future, loop=self)\n" ] }

这是日志输出:

START RequestId:ee952162-1d06-4c04-9a0d-cfd4f0fce80f 版本:$LATEST [错误] Runtime.UserCodeSyntaxError:模块中的语法错误 “reddit_alexa_py”:无效语法(base_events.py,第 296 行) Traceback (最近一次通话最后):文件“/var/task/asyncio/base_events.py” 第 296 行 future = tasks.async(future, loop=self)END RequestId: ee952162-1d06-4c04-9a0d-cfd4f0fce80f REPORT RequestId: ee952162-1d06-4c04-9a0d-cfd4f0fce80f 持续时间:19.71 毫秒 持续时间:100 毫秒内存大小:128 MB 使用的最大内存:57 MB

我尝试导入的其他内容也会发生这种情况。我想我需要导入这些包才能完成这个项目,所以任何帮助都将不胜感激。谢谢!

编辑:这是 Python 文件https://drive.google.com/file/d/1_rbNLlwRBmt_6J0YMMa4idPSfmOKZb_j/view?usp=sharing的链接

【问题讨论】:

  • 你能发布你的代码吗?另外,我认为 Python 不会从 zip 文件中导入模块……为什么需要压缩模块?是否可以在 Alexa 开发者控制台中运行 pip install asyncio
  • @EdWard 我在线观看了有关如何将部署包添加到 AWS Lambda 函数代码的教程。这是我使用的视频的链接:youtube.com/watch?v=rDbxCeTzw_k。我还在描述中添加了指向我的 Python 文件的链接。每次我尝试导入 asyncio 时,Alexa 测试都会自动中断。

标签: python amazon-web-services import aws-lambda


【解决方案1】:

您不应在要求中包含 asyncio,因为它已经是 stdlib 的一部分。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 上传打包到 Lambda 层会上传到 /opt/。

    Packaged压缩到python文件夹时,上传到/opt/python文件夹,lambda中设置的layer导入的模块默认路径为/opt/python。

    但是,asyncio 模块不应通过将其放在 python 文件夹中并根据 aws 指南对其进行压缩来上传到层。 我不知道具体为什么。

    为避免此错误,请将 pip 模块安装在不同的文件夹(不是 python 文件夹)并压缩它们。 (例如:./python-modules)

    上传(python-modules.zip)到layer并在lambda中写如下,就没有问题了。

    import sys
    sys.path.append("/opt/python-modules")
    import asyncio
    

    还不够,但感谢阅读。

    【讨论】:

      【解决方案3】:

      我在 python 3.8 上并且我的程序在本地运行良好,但是当将它打包并将其添加到 lambda 函数时,我得到了完全相同的错误。事实证明,asyncio 是 python 的一部分,但如果你不知道这一点并像我一样做一个 pip 来安装它,你会得到第二个副本。我在图层中使用了第二个副本并不断收到错误。在尝试了很多不同的变体/版本/等之后,我意识到 python 包含的版本与安装的一个 pip 完全不同。 解决方案很简单,确保您不要尝试 pip asyncio,只需让 lambda 从您正在使用的 python 版本中提取它并确保您没有在您的搜索路径中的某处有第二个(不同的)版本...

      【讨论】:

        【解决方案4】:

        我不确定 asyncio,但对于一般的 python 包,您需要确保您的包是为 Amazon Linux 1(用于 python 3.7 运行时)和 Amazon Linux 2(用于 python 3.8 运行时)构建的。在后台,Lambda 使用运行 Amazon Linux 的容器,您需要确保您上传的包与该操作系统兼容。纯 python 包是可以的,但是任何带有编译内容的东西都需要特定于操作系统。

        此外,您需要确保将整个包与您的代码一起压缩。

        更简单的方法是使用无服务器框架及其 serverless-python-requirements 插件。这将有助于自动执行此操作,因此您不必一直手动修补这些东西。

        还可以查看 https://github.com/keithrozario/Klayers,它有一大堆可供快速使用的 python 包——不幸的是没有 asyncio。

        【讨论】:

          【解决方案5】:

          我使用了类似的过程。在压缩所有内容之前,我必须将导入的模块复制到工作目录的子目录中。将 zip 文件加载到 Lambda 函数后,我可以通过查看 Lambda 控制台中的函数来验证我想要导入的代码是否已加载。

          对我来说关键是,在我的本地计算机上,我必须在压缩工作目录之前找到 psycopg2 目录并将整个目录复制到我正在编写 postgresql_test.py 的工作目录中。

          【讨论】:

          • 如果你不介意我问,你在哪里找到 psycopg2 文件夹?
          • 我不太记得了,但在我的项目笔记中我指出了linkedin.com/pulse/…,所以我想我遵循了该页面上的git clonecp 说明。
          猜你喜欢
          • 2016-07-23
          • 1970-01-01
          • 1970-01-01
          • 2020-04-03
          • 2021-01-09
          • 1970-01-01
          • 2022-06-22
          • 2019-02-23
          • 2021-11-01
          相关资源
          最近更新 更多