当前位置: 首页 > 知识库问答 >
问题:

Python在运行AWS sam本地调用时未找到模块

许华清
2023-03-14

我刚开始使用SAM使用AWS serverless,遇到以下问题:

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

我的项目结构如下:

根目录/

  • mymodulename/
    • mymodule.py
    • sam/
    • test_event.json

    我在python3.6虚拟环境中工作,并使用安装工具安装了python包(mymodulename):

    python setup.py develop
    

    因此,如果我在虚拟环境中执行pip冻结,我会看到:

    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'"}
    

    以下是my app.py的代码:

    from mymodulename.mymodule import mymodulefunction
    
    def lambda_handler(event, context):    
        return mymodulefunction(event['body'])
    

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

    template.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
    

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

    然而,这对于更大的项目来说是不现实的,我想现在的答案可能是这样的。虽然这是serverless.yaml.但我不确定SAM是否支持这种语法。猜测没有。

共有1个答案

公良昕
2023-03-14

这是一个很长的时间以来,这个问题是开放的,但它可能会帮助一些人。我是如何修复的:

  • 代码mymodename/移动到mymodename/mymodename/__init__. py
  • mymodename中创建一个setup.py负责创建一个名为mymodename
  • 的包
  • 在lambda函数的requirements.txt中添加以下内容:-e mymodename/

-e引用了您的本地代码,此链接可能也会有所帮助。

 类似资料:
  • 通常我可以使用npm安装一个库,但是今天在安装yeoman时我遇到了这个错误。请帮助找出根本原因。 我查看了文件夹: C:\Program Files\nodejs\node\u模块\npm\bin\ 但是,请不要将node_modules文件夹视为所描述的错误。 我也试着找到npm-cli.js,看到它实际上在

  • 我在Mac上使用了蝗虫1.4.2,当我使用时,我得到了这个错误

  • 我一直试图提交一个简单的python脚本,以便在一个带有Yarn的集群中运行它。当我在本地执行作业时,没有问题,一切都很好,但当我在集群中运行它时,它就失败了。 诊断:文件不存在:hdfs://myserver:8020/user/josholsan/.sparkstaging/application_1510046813642_0010/test.py 我不知道为什么它找不到test.py,我也

  • 问题内容: 我已经阅读了多篇文章和许多文章,详细介绍了cron作业中的脚本需要保留由于cron中shell的打开而在脚本本身内部运行所需的环境变量。我的情况是独特的,因为我的路径变量都是按照所讨论的那样设置的,这反过来将使用subprocess.call ()成功调用pysaunter python egg ,但是它似乎从那里分解了。这导致整个过程中断了cron作业。 为了清楚起见,以下是我引用的

  • 在一个项目中,我们将Hibernate与HikariCP结合使用,并且在Eclipse中一切都很好。但一旦我生成了一个jar文件(Maven),就再也找不到hikaricp了。我已经从各个可能的角度考虑了这个问题,但我无法找出问题所在。。。 坚持不懈xml 波姆。xml 如果我在Eclipse中运行此功能,则一切正常: 01:14:05,436信息HikariDataSource: 70-Hika

  • 问题内容: 许多第三方Python模块都有一个属性,该属性保存该模块的版本信息(通常类似或),但有些则不然。 此类模块的特定示例是libxslt和libxml2。 我需要检查这些模块在运行时是否使用了正确的版本。有没有办法做到这一点? 潜在的解决方案是在运行时读取源代码,对其进行哈希处理,然后将其与已知版本的哈希进行比较,但这很讨厌。 有更好的解决方案吗? 问题答案: 我会远离哈希。正在使用的li