AWS SAM项目运行pytest报ModuleNotFoundError找不到config模块如何解决
问题根因
AWS SAM本地运行时会自动将layers目录添加到Python的模块搜索路径(sys.path)中,所以from config.settings import xxx这类导入可以正常识别;但本地执行pytest时,默认只会将当前执行命令的目录(你提到的项目根目录)加入搜索路径,layers下的config、utils模块没有被纳入搜索范围,所以触发ModuleNotFoundError。
可用解决方案
方案1:无代码侵入配置(推荐)
无需修改任何业务代码,仅调整pytest运行配置即可:
- 在项目根目录创建
pytest.ini配置文件,写入以下内容:
[pytest] pythonpath = account/layers
- 配置完成后直接执行原测试命令即可正常运行:
python3 -m pytest tests/unit/
如果不想加配置文件,也可以单次执行测试时临时指定路径,Mac/Linux下命令如下:
PYTHONPATH=./account/layers python3 -m pytest tests/unit/
方案2:统一全路径导入(适配所有运行场景)
如果要兼顾本地测试、SAM部署、云端运行的兼容性,可以统一调整导入规则:
- 修改
layers/utils/logger.py的导入语句:
将from config.settings import ApplicationConfig调整为from layers.config.settings import ApplicationConfig - 修改
get_accounts/app.py的导入语句:
将原有导入
from config.settings import ApplicationConfig from utils.logger import get_logger
调整为
from layers.config.settings import ApplicationConfig from layers.utils.logger import get_logger
- 在项目根目录创建空的
conftest.py文件,pytest会自动将该文件所在目录加入模块搜索路径,直接运行测试命令即可。
之前尝试方案无效的原因
- 给目录加
__init__.py仅能将目录标记为Python包,无法解决模块搜索路径缺失的问题,所以无效 - 编写
setup.py时仅指定config为包名,没有将layers下所有子模块都纳入可导入范围,且安装后没有对应调整导入路径,所以不生效 - 仅修改了
get_accounts/app.py的导入加layers前缀,没有同步修改layers/utils/logger.py内部的导入语句,所以logger模块还是找不到config包 - 删除test目录下的
__init__.py和本次导入错误没有关联,所以无法解决问题
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

