pytest 报 ModuleNotFoundError 怎么解决?
pytest 找不到模块通常是因为 tests 目录不是包或项目根目录不在 sys.path 中。解决方法:加 __init__.py、配 pythonpath、用 pip install -e . 安装项目。
最常见的修复:在 tests/ 目录里加一个空的 __init__.py;如果还不行,在 pytest 配置中设置 pythonpath = .(pytest 7+),或在项目根目录执行 pip install -e . 把项目本身安装为可编辑包。
方法一:tests 目录加 init.py
tests/
├── __init__.py # 空文件
└── test_module_functions.py
pytest 按包结构解析导入,有了 __init__.py 它才能正确确定模块路径。
方法二:配置 pythonpath(pytest 7.0+)
# pytest.ini
[pytest]
pythonpath = .
把项目根目录加进 sys.path,测试中 from myapp import xxx 就能找到。
方法三:以可编辑模式安装项目(最规范)
pip install -e .
前提是有 pyproject.toml 或 setup.py。安装后项目包进入 site-packages,任何位置都能 import——这也是 CI 环境的标准做法。
为什么不推荐手动改 sys.path
老式办法是在 __init__.py 或 conftest.py 里写 sys.path.append('.'),能工作但脆弱:依赖运行目录、容易在 CI 里失效。优先用方法二或三。
常见问题(FAQ)
Q:直接 python 运行脚本能 import,pytest 就不行?
A:运行脚本时 Python 把脚本所在目录加进 sys.path;pytest 有自己的导入机制(rootdir/conftest 规则),两者不同,所以表现不同。
Q:rootdir 和这个问题有关吗?
A:有关。pytest 以 rootdir(含 pytest.ini/pyproject.toml 的目录)为基准解析。确认从项目根目录运行 pytest。
Q:src 布局(src/myapp/)怎么配?
A:pythonpath = src,或 pip install -e .(推荐,src 布局配合可编辑安装是标准实践)。