Skip to content

v2.3.3 — Python 版本校验,修复 cmd 撕裂中文行

Choose a tag to compare

@TaoCosmo-Dev TaoCosmo-Dev released this 19 Sep 04:30
· 7 commits to main since this release

两个问题出在同一处入口,第二个是在修第一个时撞出来的。

🔍 安装脚本此前不校验 Python 版本

只要 PATH 里有 python 就直接采用。装的是 3.8 时,第 1 步不报错,拖到装依赖时才以 pip 的报错形式暴露 —— 而那时的错误信息指向依赖解析,而非真正的版本问题。

更隐蔽的是:pip 未必报错。旧解释器下它会静默装上一个还支持该版本的老版 pyelftools,其 DWARF 5 支持较弱,崩溃定位随之失准,而全程没有任何提示。

现在第 1 步显式验版:

  • PATH 里版本过低时,改从已知安装位置查找合格版本
  • 均不可用时,明确告知检测到的版本、来源路径、3.10 的原因,以及 PATH 中旧版排序靠前时的处理办法

requirements.txt 中记录了版本下限的唯一来源是 pyelftools(0.33 起要求 3.10)—— 本套件自身的代码没有用到任何 3.10 专属语法。

不做自动升级是有意为之:静默改动用户的 Python 环境可能破坏其它项目,且需要管理员权限。

🐛 cmd.exe 会把批处理里的中文行拦腰截断

编写上述中文提示时暴露:cmd 按固定块读取批处理文件,跨块边界的多字节字符被撕裂后,行尾残余会被当成命令执行。

期望: 该库 0.33 版起要求 Python 3.10。这是唯一的版本下限来源。
实际: '这是本套件唯一的版本下限来源。' is not recognized as an internal or external command

断在哪一行完全由字节偏移决定 —— 增加一个字节的填充,断点就换位置。因此文件任何位置的编辑都可能让另一行出问题,现有文件"能跑"只是字节布局碰巧合适。

实测 11 种偏移:

编码 出错次数
UTF-8 无 BOM 1 / 11
UTF-8 有 BOM 0 / 11
GBK 无 chcp 0 / 11

三个发布脚本(setup_env.bat、setup_env.ps1、inject_to_project.bat)统一加 UTF-8 BOM。选 BOM 而非 GBK,是因为 GBK 仅在中文 Windows 上正确。此改动同时解决 PowerShell 5.1 将 .ps1 按 ANSI 读取的问题。

🔧 另修两处批处理陷阱

  • :: 注释仍会被扫描重定向符。注释中的 >= 会将该行截断,其后内容被当作命令执行。
  • 延迟扩展与字面量 ! 冲突。启用 enabledelayedexpansion 后,同一行中的字面量 [!] 与 !VAR! 会让 cmd 把两个 ! 之间的文本当作变量名展开为空:[!] PATH 里的 Python 是 !PY_BAD! 输出为 [PY_BAD,...。

🧪 测试

新增 tests/test_setup_scripts.py,覆盖上述四项。离线自测 91 → 96 项。

执行型测试有一处设计要点:逐字节复制发布文件,并通过 PATH 上的 stub python 拦截副作用。截断文件会改变字节偏移,测到的是永远不会发布的布局 —— 该测试的第一版正是这样写的,报出了一个发布版中并不存在的错误。

完成后移除 BOM 复验,测试如期失败,守卫有效。


Full Changelog: v2.3.2...v2.3.3