pytest运行测试导入继承抽象基类的模块报ModuleNotFoundError如何解决
导入错误原因
你遇到的报错是Python模块导入规则的正常表现,和抽象基类无关:当你运行测试时,测试文件用from project.JsonParser import JsonParser导入,相当于把JsonParser作为project包下的子模块加载,此时JsonParser.py里写的from Parser import Parser会被Python解析为搜索顶层的独立Parser模块,但你的Parser.py是存放在project包内部的,自然无法找到。
可直接落地的解决方案
方案1:统一使用包级绝对导入(适配所有场景,推荐)
所有内部模块导入都带上顶层包名,适配脚本运行、测试等所有场景:
- 把JsonParser.py内的导入语句修改为:
from project.Parser import Parser - 解决路径搜索问题,二选一即可:
- 在你执行pytest的目录下新建
pytest.ini配置文件,写入以下内容:
注意:如果你是直接cd到project文件夹内部执行pytest,pythonpath要改为[pytest] pythonpath = ...,确保Python能找到project包所在的上级目录
配置完成后直接执行pytest tests/test_JsonParser.py即可正常运行,project.py直接启动也不会出现导入问题。
2. 不用修改配置,每次运行pytest时用模块调用方式执行:python -m pytest tests/test_JsonParser.py,Python会自动把当前工作目录加入模块搜索路径。 - 在你执行pytest的目录下新建
方案2:使用相对导入,调整脚本启动方式
如果不想修改为带包名的绝对导入,可以用相对导入解决冲突:
- 把JsonParser.py内的导入语句修改为:
from .Parser import Parser - 之前直接运行
python project.py会报错,是因为直接执行的脚本会被视为顶层入口脚本,不支持相对导入,调整启动命令为python -m project.project即可正常运行,pytest执行测试也不会出现导入问题。
内容的提问来源于stack exchange,提问作者user2899525
相关产品推荐
相关产品推荐

