运行Python测试时出现ModuleNotFoundError问题求助
问题分析
直接运行src/main.py时,Python会自动将src目录加入sys.path(模块搜索路径),所以from sub.dummyB import Sub能正常找到子模块。但执行测试时,你是从项目根目录启动测试工具,此时sys.path中没有src目录,dummyA.py里的绝对导入语句就无法定位到sub模块——因为sub是src下的子模块,而非全局可见模块。
解决方案
以下三种方法可解决该问题,按需选择:
方法1:改用相对导入(规范项目结构推荐)
修改src目录内的导入语句为相对导入,让模块引用基于当前包结构:
- src/dummyA.py:
from .sub.dummyB import Sub # .表示当前目录的子模块 class Sup: def __init__(self): self.sub_var = Sub() def hello_sup(self, s): sub_word = self.sub_var.hello_sub(s) return f"Super {sub_word}!" - src/main.py:
from .sub.dummyB import Sub from .dummyA import Sup def main(): sub = Sub() sup = Sup() dummy_text = "cat" sub_word = sub.hello_sub(dummy_text) sup_word = sup.hello_sup(dummy_text) print("Sub is:", sub_word) # cat print(f"Sup is: {sup_word}") # Super cat! if __name__ == "__main__": main()
之后从项目根目录用模块方式启动主程序:
python -m src.main
测试代码无需修改,from src.dummyA import Sup能正确解析,且dummyA内的相对导入也可正常工作。
方法2:在测试文件中手动添加src到搜索路径
直接修改测试文件,将src目录加入sys.path:
- tests/test_s.py:
import sys from pathlib import Path # 把项目根目录下的src文件夹添加到模块搜索路径 sys.path.append(str(Path(__file__).parent.parent / "src")) from dummyA import Sup def test_sub_sup(): dummy_sup = Sup() expected_res = dummy_sup.hello_sup("cat") assert expected_res == "Super cat!"
这种方法无需改动原项目代码,适合快速调试,但长期维护建议采用更规范的方法1或3。
方法3:将项目安装为可编辑模式(适合全局导入场景)
从项目根目录执行以下命令,将src作为可编辑包安装到Python环境:
pip install -e .
该命令会在Python的site-packages中创建指向项目src目录的链接,之后无论在哪个目录,都能直接导入src下的模块,测试代码和主程序的导入语句无需修改。
验证
完成上述任一方法后,从项目根目录执行测试命令:
pytest tests/test_s.py # 或 python -m unittest tests/test_s.py
此时测试应能正常运行,不会再出现ModuleNotFoundError。
内容的提问来源于stack exchange,提问作者user840718
相关产品推荐
相关产品推荐

