Python单元测试报错:ModuleNotFoundError及相对导入问题求助
解决Python Lambda单元测试的模块导入问题
针对你遇到的模块导入错误,这里提供几个实用的解决办法:
方案一:调整测试代码的模块搜索路径(不修改业务代码)
保持业务代码lambda_function.py中的导入不变(from locals import FOO, FOO2),在测试文件lambda_function_tests.py开头添加代码,将app目录加入Python的模块搜索路径:
import sys from pathlib import Path # 将app目录(测试文件的父级父目录)添加到sys.path sys.path.append(str(Path(__file__).parent.parent))
之后测试文件里就可以正常使用from locals import FOO, FOO2或者from app.locals import FOO, FOO2,运行测试时Python就能找到locals模块了。
方案二:统一使用绝对导入并兼容Lambda环境
- 修改业务代码
lambda_function.py的导入为绝对导入:
from app.locals import FOO, FOO2
- 测试文件
lambda_function_tests.py同样使用绝对导入:
from app.locals import FOO, FOO2
- Lambda部署时,需要将包含app目录的上级目录作为部署包的根目录(即部署包里包含app文件夹),同时将handler配置为
app.lambda_function.handler(假设你的处理函数名为handler),确保Lambda运行时能识别app作为顶级模块。
方案三:将app作为可安装包(适合复杂项目)
在项目根目录(app的上级目录)创建pyproject.toml文件:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "app" version = "0.1.0"
然后在项目根目录执行:
pip install -e .
这会把app作为可编辑的本地包安装,之后不管是业务代码还是测试文件,都可以直接用from app.locals import FOO, FOO2,本地测试和Lambda部署(需按方案二的打包方式)都能正常运行。
内容的提问来源于stack exchange,提问作者Ravel Sbrissa Okada
相关产品推荐
相关产品推荐

