pytest 报 ModuleNotFoundError 怎么解决?

pytest 找不到模块时,先核对缺失模块名、解释器与依赖安装,再按项目布局检查 pythonpath 或可编辑安装;tests/__init__.py 不是通用修复。

最佳实践
pytest 报 ModuleNotFoundError 怎么解决?封面

先看 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 布局配合可编辑安装是标准实践)。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台