如何为特定Python版本配置tox的testenv环境?
解决tox中针对特定Python版本配置且避免重复的问题
我来帮你拆解下这个问题:你现在的配置里,py36-mylinux这类带平台后缀的环境能正常继承testenv和testenv:py36的配置,但单独跑tox -e py36时会报错,因为这个环境没匹配到任何平台规则,导致PLATFORM环境变量没被定义。同时你想给特定Python版本加依赖,但又不想重复一大串环境配置,对吧?
这里有几个简洁的解决方案,不用重复大量配置:
方案一:给PLATFORM设置默认值(最推荐)
直接在[testenv]的setenv里加一个默认值,这样不管有没有平台后缀,PLATFORM变量都不会缺失。修改后的配置如下:
[tox] envlist = py{36,37,38,39}-{mylinux,macos,mywindows} skipsdist = True [testenv] platform = mylinux: linux mymacos: darwin mywindows: win32 setenv = PLATFORM = default # 给无平台后缀的环境加默认值 mylinux: PLATFORM = linux mymacos: PLATFORM = macos mywindows: PLATFORM = windows commands = {envpython} -c "print('{env:PLATFORM}')" # 其他命令 [testenv:py36] deps = pydantic # Python3.7及以上才支持dataclasses
这样一来:
- 运行
tox -e py36-mylinux时,依然会使用PLATFORM=linux,并且安装pydantic - 单独运行
tox -e py36时,PLATFORM会用默认值default,不会再报变量缺失的错误,同时也会安装pydantic
方案二:限制只运行带平台后缀的环境
如果你根本不需要单独运行不带平台的py36环境,可以直接在调用tox时指定带平台的环境,比如tox -e py36-*就能运行所有py36对应的平台环境。另外也可以在[tox]里把envlist设成只包含带平台的组合,彻底避免单独运行无平台环境的情况。
补充说明:tox的环境继承逻辑
你当前的[testenv:py36]配置其实已经完美实现了“给特定Python版本加配置”的需求——所有py36-xxx的环境都会自动继承testenv的基础配置,再加上testenv:py36里的deps,完全不需要重复写其他配置。之前的报错只是因为单独运行py36时缺少环境变量,解决这个变量问题就搞定了。
内容的提问来源于stack exchange,提问作者xuhdev
相关产品推荐
相关产品推荐

