应用程序结构:
.
├── 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
文件中是否应该加载/设置某些内容?
编辑,我更改了一些文件的名称以将其发布到此处。
答案 0 :(得分:3)
您在此处使用relative import
,以防万一您正在执行的代码在模块中。但是,由于您的代码不是作为模块执行的,因此您的AWS Lambda失败。
https://stackoverflow.com/a/73149/6391078
在本地快速运行会出现以下错误:
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