仅使用AWS Lambda加载本地模块时出现问题

时间:2018-12-17 17:04:49

标签: python python-3.x amazon-web-services aws-lambda

应用程序结构:

.
├── Makefile
├── Pipfile
├── Pipfile.lock
├── README.md
├── template.yaml
├── tests
│   ├── __init__.py
│   └── unit
│       └── lambda_application
│           ├── test_handler.py
│           └── test_parent_child_class.py
└── lambda_application
    ├── __init__.py
    ├── first_child_class.py
    ├── lambda_function.py
    ├── second_child_class.py
    ├── requirements.txt
    └── parent_class.py

4 directories, 14 files

来自lambda_function.py的代码示例:

import os
import json
from hashlib import sha256
import boto3
from requests import Session
from .first_child_class import FirstChildClass


def lambda_handler(event, context):
    # Do some stuff.

按原样,我收到错误消息“无法导入模块'lambda_function'”,但是如果我注释掉最后一个导入,即“从.first_child_class import FirstChildClass”,它可以越过该部分并得到以下错误:我尚未为该类加载模块。

仅当我在lambci / lambda:python3.7 docker映像中运行该错误以及在AWS上进行部署时,才出现此错误。我所有的测试都通过了,它能够毫无问题地导入模块。

__init__.py文件中是否应该加载/设置某些内容?

编辑,我更改了一些文件的名称以将其发布到此处。

1 个答案:

答案 0 :(得分:3)

您在此处使用relative import,以防万一您正在执行的代码在模块中。但是,由于您的代码不是作为模块执行的,因此您的AWS Lambda失败。

https://stackoverflow.com/a/73149/6391078

在本地快速运行会出现以下错误:

PYTHON 3.6

Traceback (most recent call last):
  File "lambda_function.py", line 4, in <module>
    from .first_child_class import FirstChildClass
ModuleNotFoundError: No module named '__main__.first_child_class'; '__main__' is not a package

您的测试通过了,因为您的测试套件从module文件夹中将文件作为lambda_application导入,该文件夹在测试模块中被视为软件包


这使我朝着正确的方向前进,但并没有完全给我答案,但确实将我引向了答案,所以我想我会更新在这里找到的信息。

我没有尝试过,但是从我发现的结果来看,我相信:

from first_child_class import FirstChildClass

将是最简单的解决方法。

我最终要做的是将这些类移到一个子目录中,基本上与上面的操作相同,但包名称为前缀。

因此,文件结构更改为:

.
├── Makefile
├── Pipfile
├── Pipfile.lock
├── README.md
├── template.yaml
├── tests
│   ├── __init__.py
│   └── unit
│       └── lambda_application
│           ├── test_handler.py
│           └── test_parent_child_class.py
└── lambda_application
    ├── __init__.py
    └── lib
        ├── first_child_class.py
        ├── second_child_class.py
        └── parent_class.py
    ├── lambda_function.py
    └── requirements.txt

我的导入内容变为from lib.first_child_class import FirstChildClass