Python项目遇ModuleNotFoundError,集成测试无法执行
问题根源
这是Python模块搜索路径(sys.path)的问题。你的项目采用src布局后,根目录不在Python的默认搜索路径里,运行测试时Python找不到顶级的cryptotax模块;而如果测试里加src.前缀导入,包内部的绝对导入又会因为找不到顶级cryptotax而报错——本质是不同运行场景下,sys.path的包含目录不一致导致的。
解决方案
以下几种方法按推荐程度排序:
1. 安装可编辑模式包(最优解)
这是Python src布局项目的标准做法,能彻底解决所有路径问题:
- 在项目根目录执行命令,把包安装为可编辑模式(代码修改后立即生效,无需重新安装):
pip install -e . - 之后不管在哪个目录,都能直接导入
cryptotax模块。直接在根目录运行测试即可:
测试文件里的pytest Tests/from cryptotax.[module] import ...导入无需修改,包内部的绝对导入也能正常工作。
2. 配置pytest自动添加src路径
如果不想安装包,可以通过pytest配置让它自动把src目录加入模块搜索路径:
- 在项目根目录创建
pytest.ini文件,写入以下内容:[pytest] pythonpath = ./src - 之后直接在根目录运行测试:
测试文件的导入语句保持pytest Tests/cryptotax.[module]即可,无需修改任何代码。
3. 临时修改测试文件的sys.path(快速临时方案)
在测试文件的最顶部添加代码,手动将src目录加入Python的搜索路径:
import sys from pathlib import Path # 从测试文件所在路径向上两级,找到根目录下的src文件夹 src_dir = Path(__file__).resolve().parent.parent / "src" sys.path.append(str(src_dir))
这种方法无需额外配置,但每个测试文件都要加这段代码,路径依赖测试文件的位置,长期维护不推荐。
4. 改用相对导入(不推荐)
修改包内部的导入语句为相对导入(比如把from cryptotax.config import ...改成from .config import ...),同时测试文件里用from src.cryptotax.[module] import ...导入。但这种方法会破坏包的正常导入逻辑,导致直接运行包时可能出现问题,不建议采用。
内容的提问来源于stack exchange,提问作者Birdman
相关产品推荐
相关产品推荐

