Python Serverless (SLS): Runtime.ImportModuleError: Unable to import module

Python Serverless (SLS): Runtime.ImportModuleError: Unable to import module

我正在开发一个项目,该项目使用 AWS CodeBuild 来部署以 Python 编写的无服务器 (SLS) 函数。

部署在代码构建中运行良好。它成功创建了函数,我可以在 Lambda AWS UI 中查看 lambda。每当触发该功能时,我都会收到以下错误消息:

Runtime.ImportModuleError: Unable to import module 'some/function': attempted relative import with no known parent package

这非常令人沮丧,因为我知道该函数存在于上面列出的目录中。在 CodeBuild 脚本期间,我可以 ls 进入目录并确认它确实存在。该函数在我的 serverless.yml 文件中定义如下:

functions:
  file-blaster:
    runtime: python3.7
    handler: some/function.function_name
    events:
      - existingS3:
          bucket: some_bucket
          events:
            - s3:ObjectCreated:*
          rules:
            - prefix: ${opt:stage}/some/prefix

遗憾的是,我没能破解这个。在云中使用 SLS 和 python 时,有人有过类似的经历吗?

奇怪的是,SLS 能够成功构建和部署,但 Lambda 本身找不到函数。

我认为您需要将处理程序 属性 从 :

更改为
handler: some/function.function_name

handler: some/function.{lambda handler name}

喜欢,我的文件夹结构是:

- some
  - function1.py

那么我的模板将是:

functions:
  file-blaster:
    runtime: python3.7
    handler: some/function1.lambda_handler

有关详细信息,请在此处查看 https://serverless.com/framework/docs/providers/aws/guide/functions/

这将是对 Python 导入的较长讨论的简短回答。作为 python 项目的设计,您可以自己研究相对导入和绝对导入之间的激烈而混乱的斗争。

要点: 有必要了解 python 为 SLS 函数导入的基础 IS serverless.yml 文件存在的地方(我想它类似于 [= =11=] 调用在 sls yml 中引用为 "functions" 的其他文件)。对于我上面的案例,当我遇到问题时,我没有使用绝对导入来构建导入。我将所有导入都切换为具有绝对路径,因此当我移动包时,它会继续工作。

我得到的错误 Runtime.ImportModuleError: Unable to import module 'some/function': attempted relative import with no known parent package 很难描述实际问题。错误应该包括 some/function 正在使用的包在尝试相对导入时未找到,因为这是需要修复的实际问题。

希望有一天这能帮助其他人。如果我可以提供更多我还没有提供的信息,请告诉我。