gpt4 book ai didi

python-3.x - 运行 AWS sam 本地调用时 Python 未找到模块

转载 作者:行者123 更新时间:2023-12-03 15:14:23 27 4
gpt4 key购买 nike

我刚刚开始使用 SAM 使用 AWS 无服务器并遇到以下问题:

SAM 调用似乎找不到我的 lambda 处理程序正在导入的 python 模块,但我可以导入该模块。

结构 我的项目是:

根目录/

  • 我的模块名/
  • 我的模块.py
  • aws/
  • 山姆/
  • 模板.yaml
  • 打包的.yaml
  • 我的服务/
  • 应用程序.py
  • 测试/
  • test_event.json

  • 我在 python3.6 虚拟环境中工作,我已经使用安装工具安装了我的 python 包(mymodulename):
    python setup.py develop

    因此,如果我在我的虚拟环境中执行 pip freeze,我会看到:
    Pillow==6.0.0
    PyPDF2==1.26.0
    reportlab==3.5.20
    mymodulename==0.5.0

    另外,如果我去:
    cd root-dir/aws/sam/
    python

    >>> import mymodulename

    这成功了。所以它在python路径上。

    但是当我在本地调用 sam 时,即:
    sam local invoke MyAWSServiceFunction --event ../sam/test/test_event.json

    我得到 错误 信息:
    2019-05-02 09:19:17 Found credentials in shared credentials file: ~/.aws/credentials
    2019-05-02 09:19:18 Invoking app.lambda_handler (python3.6)

    Fetching lambci/lambda:python3.6 Docker container image......
    2019-05-02 09:19:19 Mounting /home/myname/root-dir/aws/sam/myawsservice as /var/task:ro,delegated inside runtime container
    START RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d Version: $LATEST
    Unable to import module 'app': No module named 'mymodulename'
    END RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d
    REPORT RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d Duration: 31 ms
    Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB

    {"errorMessage": "Unable to import module 'app'"}

    这是我的 的代码应用程序.py :
    from mymodulename.mymodule import mymodulefunction

    def lambda_handler(event, context):
    return mymodulefunction(event['body'])

    我可以从我的单元测试中运行上面的代码,而不是从 sam 调用环境中运行。

    模板.yaml:
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    Description: > something

    Globals:
    Function:
    Timeout: 3

    Resources:
    MyAWSServiceFunction:
    Type: AWS::Serverless::Function
    Properties:
    CodeUri: myawsservice/
    Handler: app.lambda_handler
    Runtime: python3.6

    帮助表示赞赏。

    编辑 :

    一种解决方法是将 app.py、requirements.txt 和 template.yaml 放在根目录中并执行以下操作:
    sam build

    这会将第 3 方依赖项和我自己的 python 模块存储在一起,并且 template.py 现在可以在 sam 本地调用期间找到它。

    然而,这对于更大的项目是不切实际的,我想现在的答案可能是 this .虽然这是针对 serverless.yaml 的。我不确定 SAM 是否支持这种语法。估计不行。

    最佳答案

    自从这个问题被打开以来已经有很长时间了,但它可能对某人有所帮助。我如何修复它:

  • 将您的代码从 mymodulename/ 移出至mymodulename/mymodulename/__init__.py
  • mymodulename创建 setup.py谁将负责创建一个名为 mymodulename 的包
  • 在您的 requirements.txt你的 lambda 函数添​​加这个:-e mymodulename/
  • -e引用您的本地代码,此 link可能也有帮助。

    关于python-3.x - 运行 AWS sam 本地调用时 Python 未找到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55948684/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com