DEBUG.WIKI
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
雨云;给项目一台云服务器
晚安云;香港 CN2 ¥15/月

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 指向了原来的代码。