AWS lambda python多文件应用程序可以';我们不能互相输入

AWS lambda python多文件应用程序可以';我们不能互相输入,python,amazon-web-services,aws-lambda,serverless,Python,Amazon Web Services,Aws Lambda,Serverless,我的AWS lambda项目结构如下: module app.py b.py app.py是我使用lambda\u处理程序的默认aws lambda函数,它工作正常。我决定把所有繁重的计算都拉出来,用b.py的calc 然后,我将其导入到app.py: from module.b import calc 现在,当我使用sam local invoke函数--event events/event.json在本地运行它时,它会引发一个错误: {“errorType”:“Runtime.I

我的AWS lambda项目结构如下:

module
  app.py
  b.py
app.py
是我使用
lambda\u处理程序的默认aws lambda函数,它工作正常。我决定把所有繁重的计算都拉出来,用
b.py
calc

然后,我将其导入到
app.py

from module.b import calc
现在,当我使用
sam local invoke函数--event events/event.json
在本地运行它时,它会引发一个错误:

{“errorType”:“Runtime.ImportModuleError”,“errorMessage”:“无法导入模块'app':没有名为'module'”的模块”

在我看来,当它准备运行代码时,它会将文件移动到其他目录,因此导入中断。为了解决这个问题,我尝试使用相对导入:

from .b import calc
但它也引发了一个错误:

{“errorType”:“Runtime.ImportModuleError”,“errorMessage”:“无法导入模块'app':尝试在没有已知父包的情况下进行相对导入”}


如何在aws lambda上设置多文件python应用程序?

这就是我解决该问题的方法

首先,您的根文件夹需要如下所示:

lambda_folder
    lambda_function.py // Or your main.py.... this file have the method lambda_handler
现在。。。当我使用多个文件时。。。我总是使用lib文件夹。像这样:

lambda_folder
    lib
        lib1.py
        lib2.py
        lib3.py
    lambda_function.py

重要

在lib文件夹中,您始终需要一个init.py,否则无法看到其中的文件

lambda_folder
    lib
        lib1.py
        lib2.py
        lib3.py
        __init__.py
    lambda_function.py
注意:init.py需要有下划线,但是文本中的stackoverflow不允许我写下划线

示例

lib1.py

def sum(a,b):
    return a+b

from lib import lib1
import json

def lambda_handler(event, context):
    result = lib.sum(5,4)

    return {
        "statusCode": 200,
        "body": "hi " + result
    }

lambda_函数.py

def sum(a,b):
    return a+b

from lib import lib1
import json

def lambda_handler(event, context):
    result = lib.sum(5,4)

    return {
        "statusCode": 200,
        "body": "hi " + result
    }


就这些。

这就是我解决问题的方法

首先,您的根文件夹需要如下所示:

lambda_folder
    lambda_function.py // Or your main.py.... this file have the method lambda_handler
现在。。。当我使用多个文件时。。。我总是使用lib文件夹。像这样:

lambda_folder
    lib
        lib1.py
        lib2.py
        lib3.py
    lambda_function.py

重要

在lib文件夹中,您始终需要一个init.py,否则无法看到其中的文件

lambda_folder
    lib
        lib1.py
        lib2.py
        lib3.py
        __init__.py
    lambda_function.py
注意:init.py需要有下划线,但是文本中的stackoverflow不允许我写下划线

示例

lib1.py

def sum(a,b):
    return a+b

from lib import lib1
import json

def lambda_handler(event, context):
    result = lib.sum(5,4)

    return {
        "statusCode": 200,
        "body": "hi " + result
    }

lambda_函数.py

def sum(a,b):
    return a+b

from lib import lib1
import json

def lambda_handler(event, context):
    result = lib.sum(5,4)

    return {
        "statusCode": 200,
        "body": "hi " + result
    }

仅此而已。

使用
\uuuu init\uuuuuuuuuuuupy
在模块内部导入文件包,就像
导入app.py
使用
\uuuu init\uuuuuuuuuuuuupy
在模块内部导入文件包,就像导入app.py一样

请截取根lambda文件夹的屏幕截图,另一个是b.py请…请截取根lambda文件夹的屏幕截图,另一个是b.py请…谢谢!这确实有帮助。谢谢!这实际上起了作用。