tox 嵌套变量把空格路径拆成多个参数,检查引号位置
tox 4.67.1 的嵌套 INI 变量带有引号时,展开后可能打断路径引用。将变量保存为无引号路径,在命令使用处引用完整参数,再核对实际 argv 与测试目标。
tox 4.67.1 在带空格的项目目录里运行命令,--cov 后的路径可能被拆成多个参数。直接引用某个 [vars] 值还能工作,值里再引用另一项后却失败,最终可能出现未知参数、找不到目录,或者测试只覆盖了路径的一部分。
先看命令实际收到的参数,而不是只看 tox 显示的命令行。下面这种配置容易形成问题:
[vars]
src = "{tox_root}/src"
common = "{[vars]src}/common"
INI 值里的引号也是替换文本的一部分。展开 common 时,可能得到 ""/project with spaces/src"/common";内部引号与外部引号叠在一起,后面的 shlex 分词便不再把整条路径保护为一个参数。这不是源目录不存在,也不是安装 pytest-cov 就能修复的问题。
变量存路径,命令使用处再保护整个参数
对只包含普通路径、路径本身没有引号字符的情况,去掉变量值自带的引号,在最终使用位置引用完整参数:
[tox]
env_list = probe
no_package = true
[vars]
src = {tox_root}/src
common = {[vars]src}/common
[testenv:probe]
commands =
python -c "import sys; print(sys.argv[1:])" "--cov={[vars]common}"
这是诊断环境示例,不会运行覆盖率收集。预期打印的列表只有一个元素,内容是完整的 --cov=.../src/common,包括目录中的空格。不要同时保留 [vars] 内外两层引号;只给使用位置再加引号、却保留原来的带引号值,仍可能产生错位。
确认参数边界后,将同样写法合回实际测试命令,保留原有依赖、环境变量和测试参数。如果变量被其他配置使用,先检查那些位置是否原本依赖值中的引号,避免全局改动破坏另一条命令。仅将嵌套项展开成 "{tox_root}/src/common" 也能避开这一层嵌套,但会重复路径定义;有多处引用时,优先把值与命令引用分清。
带引号字符的路径要另作核验
当前正式 4.67.1 仍先展开替换文本,再对命令字符串分词,不能把 [vars] 引用理解成一个不可拆分的参数对象。Linux 与 Windows 还存在反斜杠处理差别;上例针对普通空格路径,不承诺包含字面单引号、双引号或特殊转义的任意路径都能照搬。
在原 CI 平台用同样的 sys.argv 诊断核对实际值,再恢复测试。检查测试收集数量、覆盖率目标和输出文件位置,确认没有因为路径被截短而运行另一组测试。退出码为零只说明命令完成,不足以说明 --cov 指向了原来的代码。


