AWS Python Lambda相对导入报错:无已知父包问题排查
问题原因与解决方法
为什么会出现这个错误?
Python的相对导入(比如from . import ...)依赖于模块的包上下文——当前模块必须属于某个包,Python才能识别.对应的层级关系。
在AWS Lambda运行环境中,若你直接将src目录下的文件作为部署包根目录,或是Lambda执行main.py时将其当作顶层脚本而非包内模块处理,此时main.py的__package__属性为空,Python无法识别它属于src包,自然解析不了相对导入,就会抛出这个错误。
解决方法
方法1:调整部署包结构(最推荐)
把src目录下的所有文件(__init__.py、main.py、service.py)直接放到部署包的根目录,不再保留src子目录。
此时main.py和__init__.py同属Python的根包,你可以用以下两种方式导入conn:
from . import conn- 更简洁的
import conn(根包的__init__.py会在导入同包模块时自动加载)
方法2:保留src目录,改用绝对导入
如果要保留src目录结构,需要做两步操作:
- 在
main.py中替换相对导入为绝对导入:from src import conn - 部署时打包整个
src目录,然后在Lambda函数配置中,将handler设置为src.main.lambda_handler(告知Lambda从src包的main模块中查找处理函数)。
本地测试提示
不要直接用python src/main.py运行测试,这会因同样的原因触发相对导入错误。本地测试时,需从src的父目录执行命令:python -m src.main,这样Python会将src识别为一个包,相对导入就能正常工作。
内容的提问来源于stack exchange,提问作者Pritam Bohra
相关产品推荐
相关产品推荐

