运行python -m pytest tests命令无法定位包的问题求助
咱先搞清楚问题根源:当你在/project目录下执行python3 -m pytest tests时,Python的模块搜索路径(sys.path)里默认只有当前工作目录(也就是/project),但你的package包是放在/project/src下面的,所以Python找不到它,自然就报ModuleNotFoundError了。
给你几个实用的解决办法,按你的项目规模和需求选就行:
方法1:临时设置PYTHONPATH环境变量
这是最快的临时解决方案,直接在执行pytest的时候把src目录加入Python路径:
PYTHONPATH=src python3 -m pytest tests
这样Python就会优先在src目录下查找package这个包,测试就能正常导入了。
方法2:用conftest.py自动配置路径
如果不想每次都手动设置环境变量,可以在/project目录下创建一个conftest.py文件,内容如下:
import sys from pathlib import Path # 获取当前conftest.py所在的目录(也就是/project),然后拼接src路径 src_path = Path(__file__).parent / "src" sys.path.append(str(src_path))
pytest会自动加载项目根目录下的conftest.py,每次运行测试时都会自动把src加到模块搜索路径里,一劳永逸。
方法3:将项目安装为可编辑模式(推荐长期项目使用)
这是最规范的做法,适合需要持续维护的项目。首先在/project目录下创建setup.py文件(或者用更现代的pyproject.toml),示例setup.py内容:
from setuptools import setup, find_packages setup( name="your-project-name", # 替换成你的项目名称 version="0.1.0", packages=find_packages(where="src"), package_dir={"": "src"}, # 告诉setuptools源码在src目录下 )
然后在/project目录下执行:
pip install -e .
这个命令会把你的项目以“可编辑”模式安装到Python环境中,这样不管你在哪个目录运行测试,Python都能找到package模块,而且你对源码的修改会实时生效,不用重新安装。
补充:pytest的模块查找逻辑
pytest在运行时,会把你执行pytest命令的目录(也就是这里的/project)加入到sys.path中。所以如果你的源码不在这个目录的直接子目录里,Python就找不到对应的包。解决问题的核心就是把src目录加入到sys.path中,让Python能扫描到里面的包结构。
内容的提问来源于stack exchange,提问作者CodingButStillAlive

