tox -r运行机制及非Python文件未拷贝问题修复方案
tox -r 工作原理与问题根因 tox -r 中 -r 是 --recreate 的短参数,作用是强制清空已存在的目标虚拟环境目录,从零开始完成环境创建、全量依赖安装、测试命令执行的全流程,不会复用任何之前环境的缓存内容。
你遇到的非.py文件丢失问题,和tox本身没有直接关系:tox安装git格式的私有依赖时,本质是调用pip拉取对应分支代码,再执行依赖包内的setup.py完成打包安装流程。setuptools默认打包规则只会自动识别纳入所有.py后缀的源码文件,所有非代码类的资源文件(你这里的credentials.json、token.json都属于这类)如果没有在打包配置中显式声明,就不会被打包到最终的安装产物中,自然不会出现在虚拟环境的site-packages目录下。
你之前尝试的三个方案全部因为配置错误没有生效:
data_files配置的作用是将文件安装到系统级的固定路径,而非Python包的内部目录,且你填写的相对路径和打包时的工作目录不匹配,才会触发文件不存在的报错。- 你写的
MANIFEST.in规则存在多余单引号的语法错误,且该配置仅控制源码分发包(sdist)内的文件列表,不会影响pip安装时写入site-packages的内容,单独配置无法解决问题。 - 第三个
setup.py配置的包路径完全错误:你的代码包层级是qa_tools.api,并非根目录下的api包,packages参数手动填写['api']根本无法扫描到正确的包结构,package_data内的路径也存在重复前缀,配置自然不会生效。
修复步骤
所有修改都需要在私有依赖qa-api的git仓库中操作,修改完成后推送到master分支即可:
- 替换qa-api根目录下的
setup.py为正确配置,使用自动包扫描避免路径写错,显式声明需要包含的资源文件:
import setuptools from setuptools import find_packages setuptools.setup( name='qa-api', version='0.0.0', # 自动扫描所有带__init__.py的Python包,会自动识别qa_tools、qa_tools.api两层结构 packages=find_packages(), # 声明qa_tools.api包下需要包含的非py文件 package_data={ 'qa_tools.api': ['*.json'], }, include_package_data=True, # 原有setup.py中的其他配置(比如依赖声明等)全部保留 )
- (可选,兼容所有安装场景)在qa-api根目录新建/修改
MANIFEST.in,写入无语法错误的资源包含规则:
recursive-include qa_tools/api *.json
- 提交上述修改并推送到qa-api的master分支。
- 回到你本地的tox项目目录,重新执行
tox -r重建环境,此时两个json文件就会被正确复制到project/venv/Lib/site-packages/qa_tools/api目录下。
配置优化建议
你当前的tox.ini存在两个容易出问题的配置,可以顺手调整:
envdir = venv把tox的环境目录固定到项目下的venv,容易和你手动创建的虚拟环境冲突,建议删除该行,使用tox默认的.tox目录管理环境即可。PYTHONPATH中硬编码了Windows格式的venv/Lib/site-packages路径,在Linux/macOS环境下对应路径为venv/lib/python<版本号>/site-packages,会出现依赖找不到的问题;实际上pip安装到虚拟环境的包本身就在Python的默认搜索路径中,不需要手动把site-packages加到PYTHONPATH里,直接删掉这段硬编码即可。
内容的提问来源于stack exchange,提问作者Galoperidol
相关产品推荐
相关产品推荐

