通过tox运行pytest时无法识别子模块的问题求助
问题:tox运行pytest时无法识别子模块
app.api 运行tox执行pytest时,持续报错:
ModuleNotFoundError: No module named 'app.api'
手动安装包后直接运行pytest一切正常,求修复方法。
目录结构
|- project |- src |- app |- api |- core |- tests |- setup.py |- tox.ini |- setup.cfg
现有配置文件
tox.ini
[tox] minversion = 3.27.0 envlist = py311 isolated_build = True [testenv] setenv = PYTHONPATH = {toxinidir} deps = -r{toxinidir}/requirements_dev.txt -r{toxinidir}/requirements.txt commands = pytest --basetemp={envtmpdir}
setup.py
from setuptools import find_packages, setup if __name__ == "__main__": setup(packages=find_packages(exclude=["tests"]))
setup.cfg
[metadata] name = app version = 0.0.1 [options] packages = app python_requires = >=3.11 package_dir = =src zip_safe = no [options.extras_require] testing = pytest>=6.0 pytest-cov>=2.0 tox>=3.24
修复方案
方案1:修正PYTHONPATH指向src目录
当前PYTHONPATH设为项目根目录,但app模块实际在src子目录下,Python无法自动识别。修改tox.ini的PYTHONPATH配置:
[testenv] setenv = PYTHONPATH = {toxinidir}/src # 其余配置保持不变
方案2:让tox安装你的包(推荐)
依赖PYTHONPATH不是长久之计,正确做法是让tox在隔离环境中安装你的包,利用setup.cfg的配置:
- 移除
tox.ini中的PYTHONPATH设置 - 在
deps中添加当前包的testing extras(包含pytest等依赖):
[testenv] # 删除setenv部分 deps = -r{toxinidir}/requirements_dev.txt -r{toxinidir}/requirements.txt .[testing] commands = pytest --basetemp={envtmpdir}
因为你设置了isolated_build = True,tox会自动在隔离环境中构建你的包并安装,这样测试环境就能正确识别app.api等子模块。
额外优化:统一setup配置
setup.py和setup.cfg存在重复配置,建议简化setup.py为:
from setuptools import setup if __name__ == "__main__": setup()
所有包配置都通过setup.cfg管理,避免冲突。
内容的提问来源于stack exchange,提问作者rick_grimes
相关产品推荐
相关产品推荐

