AWS Lambda Python 基于SAM Docker部署如何导入本地模块到app.py
SAM+Docker部署Python Lambda导入报错解决方案
根因说明
你遇到的报错本质确实是Python导入机制限制:Lambda运行时加载handler时,默认会将handler对应的文件作为顶层脚本执行,不存在父包上下文,因此无法使用相对导入;如果搜索路径中未包含代码所在目录,去掉相对导入的点后也会找不到同目录模块。你之前添加sys.path的操作未生效,大概率是SAM模板的路径配置或Docker镜像的文件复制逻辑和你预期不一致。
可行操作方案
方案1:调整SAM模板配置(无代码侵入,最推荐)
无需修改代码导入逻辑,只要修正SAM模板配置即可:
- 确认模板中函数的
CodeUri参数指向src/目录 - 确认handler参数配置为
app.lambda_handler(和你实际的handler函数名对应) - 删除app.py中额外添加的sys.path相关代码,修改导入语句为:
from mymodule import myfunction
Lambda运行时会自动将
CodeUri指向的目录加入Python模块搜索路径,同目录的模块可以直接导入。
如果配置后仍然报错,可在app.py开头添加调试代码确认运行时路径:
import sys, os # 打印搜索路径确认是否包含当前代码目录 print("Python搜索路径:", sys.path) # 打印当前目录的文件,确认mymodule.py是否存在 print("当前目录文件:", os.listdir(os.path.dirname(os.path.abspath(__file__))))
方案2:保留相对导入写法
如果必须保留原有的相对导入写法,可以选择以下任意一种方式调整:
方式A:调整handler路径配置
- 在
src目录下新增空的__init__.py文件,将src标记为Python包 - 将SAM模板中的
CodeUri指向src的上级目录(项目根目录) - 将handler参数修改为
src.app.lambda_handler
此时app.py会作为src包下的模块加载,原有from .mymodule import myfunction的写法可以正常运行。
方式B:调整代码目录结构
- 新增一层包目录,结构如下:
src/ mypkg/ __init__.py app.py mymodule.py
- SAM模板的
CodeUri仍指向src/,handler参数修改为mypkg.app.lambda_handler
相对导入语句可以正常生效。
方案3:自定义Docker运行时调整
如果你使用自定义Docker镜像构建Lambda,可以直接在Dockerfile中添加搜索路径配置:
# 将src下的所有文件复制到Lambda默认工作目录/var/task COPY src/ /var/task/ # 显式将工作目录加入Python搜索路径 ENV PYTHONPATH="${PYTHONPATH}:/var/task"
此时app.py中直接使用from mymodule import myfunction即可正常导入。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

