You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:39:05