测试目录在项目子目录时pytest无法找到模块的问题排查
问题分析与解决方法
错误原因
直接运行python src/main.py时,Python会自动把src目录(当前脚本所在目录)加入模块搜索路径,所以能找到同目录下的constants.py。但执行pytest时,是从项目根目录启动的,此时src是一个独立的Python包,constants属于src包的子模块,直接from constants import HELLO会找不到这个模块。
解决方案
推荐下面两种规范的解决方式:
1. 使用绝对导入(推荐)
修改src/main.py中的导入语句:
# 替换原来的 from constants import HELLO from src.constants import HELLO
之后运行主脚本需要从项目根目录执行:
python -m src.main
这种方式符合Python包的导入规范,不管是pytest还是正常运行都能正确找到模块。
2. 使用相对导入
修改src/main.py中的导入语句为相对当前包的导入:
# 替换原来的 from constants import HELLO from .constants import HELLO
同样,运行主脚本需要从项目根目录用模块方式启动:
python -m src.main
相对导入只适用于包内部的模块引用,更适合包结构复杂的项目。
可选临时方案(不推荐)
如果不想修改运行方式,可以在src/main.py开头添加代码,手动把src目录加入模块搜索路径:
import sys import os # 获取当前脚本所在的src目录路径 src_dir = os.path.dirname(os.path.abspath(__file__)) # 把src目录加入搜索路径最前面 sys.path.insert(0, src_dir)
这种方式虽然能解决问题,但会破坏Python的包导入规范,长期维护不建议使用。
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

