pytest 报 ModuleNotFoundError 怎么解决?
pytest 找不到模块时,先核对缺失模块名、解释器与依赖安装,再按项目布局检查 pythonpath 或可编辑安装;tests/__init__.py 不是通用修复。
先看 ModuleNotFoundError 中缺少的模块名,并确认运行 pytest 的解释器与依赖环境。 应用包未安装时可使用可编辑安装;本地路径配置和 tests/init.py 仅在对应导入布局下适用,不是通用修复。
方法一:tests 目录加 init.py
tests/
├── __init__.py # 空文件
└── test_module_functions.py
pytest 按包结构解析导入,init.py 会改变测试包结构及部分 import mode 的路径处理,但不会自动安装应用依赖;独立测试模块或 importlib 模式也可不需要它。
方法二:配置 pythonpath(pytest 7.0+)
# pytest.ini
[pytest]
pythonpath = .
此配置把 rootdir 对应目录加入 sys.path;只有该路径下确有可导入的 myapp 且环境依赖完整时,from myapp import xxx 才能成功。
方法三:以可编辑模式安装项目(最规范)
pip install -e .
前提是有 pyproject.toml 或 setup.py。可编辑安装通常通过元数据和路径/导入钩子引用源码,并非把源码完整复制到 site-packages;需使用安装时的同一环境且打包配置正确——这也是 CI 环境的标准做法。
为什么不推荐手动改 sys.path
老式办法是在 __init__.py 或 conftest.py 里写 sys.path.append('.'),能工作但脆弱:依赖运行目录、容易在 CI 里失效。优先用方法二或三。
常见问题(FAQ)
Q:直接 python 运行脚本能 import,pytest 就不行?
A:运行脚本时 Python 把脚本所在目录加进 sys.path;pytest 有 prepend/append/importlib 等导入模式,rootdir 本身不负责把应用加入 sys.path,两者不同,所以表现不同。
Q:rootdir 和这个问题有关吗?
A:rootdir 用于测试节点ID、配置及缓存等,不会自动加入 sys.path。应核对解释器、包安装、import mode 和显式 pythonpath;单纯改变 rootdir 不保证修复。
Q:src 布局(src/myapp/)怎么配?
A:pythonpath = src,或 pip install -e .(推荐,src 布局配合可编辑安装是标准实践)。