根本原因是 pytest 启动时的 sys.path 与预期不一致,它默认以执行目录为根,不自动包含项目根或 src/ 目录;若 mypackage 不在 sys.path 中且无 __init__.py,就会报 modulenotfounderror。

为什么 pytest 找不到你的模块?
根本原因不是 pytest 本身有问题,而是它启动时的 sys.path 和你预期的不一致——它默认以当前执行目录为根,不会自动把项目根目录或 src/ 目录加进去。如果你在 tests/test_main.py 里写 import mypackage,而 mypackage 不在 sys.path 里,就必然报 ModuleNotFoundError。
检查并修正 Python 路径加载顺序
先运行 python -c "import sys; print('\n'.join(sys.path))",再对比 pytest --version 执行时的路径(可在测试文件开头加 print(sys.path))。常见错位点:
- 你在项目根目录下执行
pytest tests/,但模块在src/mypackage/下,pytest 默认不把src/加入路径 - 你用了
python -m pytest,它会把当前目录加入sys.path[0];但直接调用pytest命令时,这个行为可能不同(尤其在虚拟环境或 IDE 中) -
__init__.py缺失:哪怕路径对了,mypackage目录下没__init__.py,Python 也不会把它当包处理
三种可靠且可复用的修复方式
优先级从高到低,按项目结构选一种:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 用
pyproject.toml配置[tool.pytest.ini_options]+pythonpath = ["src"](推荐)——适用于src/mypackage结构,pytest 7.0+ 原生支持,无需额外依赖 - 在项目根目录放
conftest.py,开头加:import sys<br>from pathlib import Path<br>sys.path.insert(0, str(Path(__file__).parent / "src"))
——简单直接,但只对 pytest 生效,不影响其他工具 - 安装为可编辑包:
pip install -e .,前提是项目有pyproject.toml或setup.py定义了packages——最符合生产实践,但要求正确配置find_packages()或显式列出包名
容易被忽略的陷阱
很多团队卡在看似“修好了”的假象上:
- IDE(如 PyCharm)自带路径注入,测试能跑通,但 CI 里失败——务必在纯终端中验证
pytest命令行为 - 误用相对导入:
from . import module在测试文件里几乎总失败,因为测试文件不是包内模块,不能用.开头 -
pytest-pythonpath插件已废弃,别再装它;新版 pytest 内置pythonpath配置就够了 - 路径里含空格或中文时,某些 shell 下
pythonpath配置会解析失败,建议用绝对路径或避开特殊字符
真正稳定的方案,永远是让模块可被 Python 正常 import——不管 pytest 还是 python -m mypackage.cli,都该成功。路径问题只是表象,根源在于包结构和安装方式是否合规。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










