Pytest测试Python项目遇ModuleNotFoundError:模块内导入失败求助
解决Pytest测试时ModuleNotFoundError:找不到module2的问题
问题根源
你遇到的问题是导入路径的上下文不一致导致的:
- 直接运行项目脚本时,Python的工作目录通常是
src/myproject/(或通过main.py启动,此时myproject作为包存在,内部模块的导入逻辑能正常工作); - 但用Pytest运行测试时,工作目录是项目根目录,即便你在
test_module1.py里把src加入sys.path,module1.py里的import module2是尝试从顶级路径搜索module2,而module2实际属于myproject包,自然会找不到。
你之前尝试的from . import module2是相对导入,理论上应该生效,但可能因为测试时的导入方式(从myproject.module1导入)和直接运行module1.py的场景冲突,或者Pytest的导入机制细节导致失效,下面给出更稳妥的解决方法:
解决方案
方案1:改用绝对导入(推荐)
修改module1.py里的导入语句,从:
import module2
改为基于项目包的绝对导入:
from myproject import module2
这样不管是直接运行项目,还是通过Pytest测试,Python都会从src目录下的myproject包中查找module2,完全避免路径上下文的问题。
方案2:通过PYTHONPATH环境变量指定src路径
在运行Pytest前,先设置环境变量把src目录加入Python的模块搜索路径:
- Linux/macOS终端:
export PYTHONPATH=./src && pytest tests/test_module1.py
- Windows命令行:
set PYTHONPATH=./src && pytest tests/test_module1.py
- Windows PowerShell:
$env:PYTHONPATH = "./src"; pytest tests/test_module1.py
设置后,Python会把src视为顶级模块目录,myproject作为顶级包,此时module1.py里的import module2会被解析为myproject.module2,就能正常找到。
方案3:用conftest.py统一配置路径
在tests目录下创建conftest.py文件,内容如下:
import sys from pathlib import Path # 获取项目根目录下的src路径并加入sys.path src_path = str(Path(__file__).parent.parent / "src") if src_path not in sys.path: sys.path.append(src_path)
这样所有测试文件都会自动继承这个路径配置,不用在单个测试文件里重复写sys.path的代码,同时确保导入路径的一致性。
额外说明
如果你需要保留module1.py可以直接运行的能力(比如python src/myproject/module1.py),可以在module1.py开头加入一段路径适配代码:
import sys from pathlib import Path # 如果是直接运行该脚本,把上级目录加入sys.path if __name__ == "__main__": sys.path.append(str(Path(__file__).parent.parent)) from myproject import module2
这样既不影响测试时的绝对导入,也能支持直接运行脚本。
内容的提问来源于stack exchange,提问作者nos codemos
相关产品推荐
相关产品推荐

