GitHub Actions运行pytest无法导入src模块报ModuleNotFoundError如何解决
认知误区澄清
你确实存在相关认知误区:pip install .不会自动识别项目内所有目录作为Python模块安装,能否正确安装本地模块完全取决于你根目录下setup.py/setup.cfg的打包配置,没有正确配置src目录的打包规则时,执行完该命令也不会将src目录注册到Python的模块搜索路径中,测试时自然找不到对应的模块。
你写的python -m pip install src是完全无效的操作,src是本地目录而非PyPI上的公开包,执行该命令不会产生任何实际效果。
问题根本原因
pytest默认不会自动将项目根目录加入Python的模块搜索路径,你直接执行pytest命令时,Python只会从系统预装包、pip安装的第三方包、当前测试文件所在的utils目录搜索模块,找不到根目录下的src文件夹,因此抛出ModuleNotFoundError。
你去掉导入语句的src前缀也无法解决问题,因为capital.py文件存放在src目录下,不在Python的搜索路径范围内。
解决方法
你可以任选以下任一方案修复问题:
- 方案1:修正打包配置,确保
pip install .可以正确安装src下的模块
调整你的setup.py配置,添加src目录的打包规则,示例如下:
配置正确后,执行from setuptools import setup, find_packages setup( name="example-package", version="0.1", packages=find_packages(where="src"), package_dir={"": "src"}, )pip install .就会自动将src下的模块安装到当前Python环境中,无需额外配置即可正常导入。 - 方案2:临时将项目根目录加入Python搜索路径(无需修改打包配置)
调整ci.yml中pytest的执行命令,Windows环境下修改为:- name: Test with pytest run: | python -m pip install pytest $env:PYTHONPATH = "." pytest - 方案3:给pytest添加根目录参数
直接修改执行命令为python -m pytest --rootdir=.,pytest会自动将指定的根目录加入搜索路径。
最后统一删除ci.yml里无效的python -m pip install src命令,避免不必要的报错。
内容的提问来源于stack exchange,提问作者carlorop
相关产品推荐
相关产品推荐

