Lambda 函数 - 如何将 Python 代码拆分到多个文件中

Dom*_*man 5 python python-3.x aws-lambda

问题

我试图将 lambda 函数的 python 代码拆分到多个文件中,但是任何导入其他相关模块的尝试都会引发顶级模块的错误。

{
  "errorMessage": "Unable to import module 'download_ga_data'"
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?这感觉应该是超级基本的。

文件结构布局(从根开始显示)

- download_ga_data.py
   - [analytics]
        - google.py (contains a single class)
        - __init__.py
   - [helpers]
        - main.py (contains a single class)
        - __init__.py
   - {other libraries from site-packages}
Run Code Online (Sandbox Code Playgroud)

download_ga_data.py 的内容

# import unicodecsv as csv
import os

# import path
from . import definitions
from analytics.google import GoogleAnalytics
from helpers.main import GoogleCloudStorageBucket

def lambda_handler(event, context):
    print("test")
Run Code Online (Sandbox Code Playgroud)

按照目前的情况,这会引发错误。如果我注释掉 os 之后的三个导入,那么它将正常运行。

我应该如何正确导入这两个模块,我觉得我缺少一些超级基本的东西。

环境注意事项

这一切都是基于以下lambda 模仿 docker构建的,并直接上传到 S3。所有文件都是 777 以绕过任何权限错误。

Dom*_*man 1

好吧终于解决了这个问题。我收到的帮助解决此问题的主要技巧是将我的加载函数包装在 try except 块中:

try:
    import definitions
    from analytics.google import GoogleAnalytics
    from cloud_helpers.main import GoogleCloudStorageBucket
except Exception as e:
    error = str(e)
    stacktrace = json.dumps(traceback.format_exc())
    message = "Exception: " + error + "  Stacktrace: " + stacktrace
    err = {"message": message}
    return respond(err)

def respond(err, res=None):
    return {
        "statusCode": "400" if err else "200",
        "body": err["message"] if err else json.dumps(res),
        "headers": {"Content-Type": "application/json"},
    }
Run Code Online (Sandbox Code Playgroud)

然后显示了以下错误(令人恼火的是,我只有一个屏幕截图):

在此输入图像描述

然后通过切换到解决了import definitions