Python AWS SAM项目运行unittest报ModuleNotFoundError导入错误求助
问题根因
报错本质是导入写法和包引用模式不匹配:你在业务代码里用的是无路径的直接导入(比如import mongodb_service),属于隐式相对导入,仅当你直接运行mongodb_crud_service目录下的脚本、且工作目录切到该文件夹时才能正常解析。当你在项目根目录通过from functions.mongodb_crud_service import app以包形式导入时,Python不会自动将mongodb_crud_service目录加入模块搜索路径,自然找不到同目录下的依赖模块。
解决方案
方案1:使用显式相对导入(优先选择,完全适配AWS SAM运行环境)
直接修改业务文件中的本地导入语句,是Python 3推荐的包内导入写法,本地测试和SAM部署到Lambda后都能正常运行,不需要额外配置:
- 编辑
functions/mongodb_crud_service/app.py,将原有的同目录模块导入替换为from . import mongodb_service(如果是直接导入模块内的方法/类,写法为from .mongodb_service import xxx) - 编辑
functions/mongodb_crud_service/mongodb_service.py,将原有的secrets_manager导入替换为from . import secrets_manager_service
修改完成后直接在项目根目录执行python -m unittest discover即可正常运行测试,不需要调整目录结构或环境变量。
方案2:使用根路径绝对导入
如果不习惯相对导入的写法,可以把所有包内导入统一写成从项目根目录起始的完整路径:
app.py中导入mongodb_service的语句改为from functions.mongodb_crud_service import mongodb_servicemongodb_service.py中导入secrets_manager的语句改为from functions.mongodb_crud_service import secrets_manager_service
这种写法的注意点是所有执行、测试命令都必须在项目根目录下运行,否则会出现路径解析错误。
方案3:临时配置PYTHONPATH(仅适合临时调试,不推荐长期使用)
如果暂时不想修改业务代码,可以在执行测试命令前将项目根目录加入Python的模块搜索路径,不同环境的执行命令如下:
- Linux/macOS:
PYTHONPATH=. python -m unittest discover - Windows CMD:
set PYTHONPATH=. && python -m unittest discover - Windows PowerShell:
$env:PYTHONPATH="."; python -m unittest discover
这种方案的缺点是每次执行命令都需要额外配置环境变量,部署到AWS Lambda时还要单独配置PYTHONPATH环境变量,维护成本较高。
排查提示
- 你当前目录结构里的各级
__init__.py空文件已经满足Python包识别要求,不需要额外添加内容 - 如果修改导入后仍然报缓存类错误,可以先删除项目中所有
__pycache__缓存目录,再重新执行测试命令
内容的提问来源于stack exchange,提问作者AwesomeSauce Electronics
相关产品推荐
相关产品推荐

