pytest找不到my_module的根本原因是当前工作目录错误,而非路径本身;应始终在项目根目录运行pytest,并确认my_module含__init__.py、src在sys.path中,且pyproject.toml配置pythonpath=["src"]。

pytest找不到my_module:根本不是路径问题,而是当前工作目录搞错了
pytest 默认以你执行命令时所在的目录为根,去解析 import 语句。如果你在项目子目录(比如 tests/)里运行 pytest,而模块在上层或同级的 src/ 或 app/ 下,Python 就会报 ModuleNotFoundError —— 它不是“不会找”,是压根没从你期望的位置开始找。
实操建议:
- 用
pwd(Linux/macOS)或cd(Windows)确认当前终端位置,再对照你的模块路径 - 最稳妥的做法:始终在项目根目录(即
pyproject.toml或setup.py所在目录)下运行pytest - 避免在
tests/目录内直接执行pytest,除非你显式设置了PYTHONPATH或使用了--import-mode=importlib
__init__.py缺失或位置不对,导致pytest认为不是包
pytest 依赖 Python 的包发现机制。如果 my_module 是个目录,但里面没有 __init__.py(哪怕空文件),或者它被放在了非标准位置(比如和 tests/ 并列但没被识别为源码根),import my_module 就会失败,且错误信息常被误读为“模块不存在”,其实是“不构成可导入包”。
实操建议:
- 检查
my_module/目录下是否有__init__.py;若用的是 Python 3.3+,也建议保留,因为 pytest 不完全依赖 PEP 420 隐式命名空间包 - 确保
my_module所在目录已加入 Python 模块搜索路径——可通过python -c "import sys; print(sys.path)"验证 - 如果用
src/布局(推荐),确认src/在sys.path中;可用pytest --import-mode=importlib强制按 importlib 加载,绕过部分路径限制
pytest配置文件干扰了导入行为
一个不起眼的 pytest.ini 或 pyproject.toml 里的 testpaths、python_paths 或 python_files 配置,可能让 pytest 改变默认的模块解析上下文。比如 python_paths = ["."] 看似无害,但如果当前目录不是项目根,反而会锁死搜索范围。
实操建议:
- 临时重命名
pytest.ini、pyproject.toml中的[tool:pytest]或[tool.pytest.ini_options]段,看是否恢复导入 —— 这能快速定位是否是配置惹的祸 - 优先用
pyproject.toml中的[[tool.pytest.ini_options]]控制pythonpath,而不是靠环境变量;例如:[tool.pytest.ini_options] pythonpath = ["src"]
- 慎用
conftest.py里的sys.path.append(...)—— 它只影响测试收集阶段,不保证所有测试文件都能一致导入
IDE 和命令行环境不一致,让你误判问题
PyCharm 或 VS Code 可能自动把项目根加进 PYTHONPATH,或用自己封装的 pytest runner,导致你在编辑器里跑通,但终端里失败。这不是 bug,是环境隔离没做好。
实操建议:
- 在终端里执行
which pytest和python -m pytest --version,确认用的是同一个解释器和 pytest 版本 - 对比 IDE 运行时的环境变量:在终端中运行
env | grep PYTHON,看是否有PYTHONPATH或PYTHONHOME干扰 - 统一用
python -m pytest替代裸pytest命令,能强制使用当前 Python 解释器及其 site-packages 和路径设置
python -c "import my_module; print(my_module.__file__)",再运行 python -m pytest tests/ —— 如果前者成功后者失败,基本锁定是 pytest 自身的导入策略问题,而不是代码或安装问题。路径、包结构、配置三者交叉影响,单点排查容易漏掉组合效应。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











