You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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的配置:

  1. 移除tox.ini中的PYTHONPATH设置
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:04:01