☰
WinPython Zero 32-bit 3.5.4.2 版本变更全解析:从 3.5.4.1Zero 升级包清单到 changelog 自动生成机制
2026/10/16 5:33:49 网站建设 项目流程
  • 开发工具
  • 构建工具
  • CLI
  • 包管理器

【免费下载链接】winpython

A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python.

项目地址:https://gitcode.com/gh_mirrors/wi/winpython
点击查看免费下载

本文以 WinPython 仓库中的 WinPythonZero-32bit-3.5.4.2_History.md 变更记录为主体,逐项拆解该 32 位零版(Zero 风味)发行版自 3.5.4.1Zero 以来的全部软件包升级,并结合仓库中的wppm包管理器与wppm.diff模块源码,说明这类_History.md变更日志是如何被自动生成、校验与再使用的。读完本文,你既能掌握该版本的具体包变动明细,也能理解 WinPython 发行版的“包索引(package index)→ 版本对比 → 变更日志”这条自动化链路。

一、文档定位:一份_History.md变更日志在 WinPython 仓库中的角色

在仓库 changelogs 目录下,每个发行版都有两类文件:以 WinPythonZero-32bit-3.5.4.2.md 为代表的包索引清单(列出该版本内置的全部 Tools 与 Python 包),以及本文主体 WinPythonZero-32bit-3.5.4.2_History.md 这类变更历史记录(列出相对于上一版本新增、升级、移除的包)。

本次变更记录的内容为:自 3.5.4.1Zero 以来,WinPython-32bit 3.5.4.2Zero 发行版中共有 11 个包被升级,无新增包、无移除包。这是一次典型的“小步快跑”维护性发布,全部变更集中在包版本更新上。

从源码结构看,_History.md文件与包索引文件存在明确的生成关系:wppm/diff.py中的compare_package_indexes会读取两个版本对应的WinPython{flavor}-{architecture}bit-{version}.md包索引,逐节对比 Tools / Python packages / WheelHouse packages 三个区块,产出形如本文的变更记录。因此,本文档并非手写产物,而是仓库自动化工具链的输出结果(详见第五节)。

二、3.5.4.2Zero 升级包完整清单

以下 11 个包在本次版本中完成了升级(原文档列表,完整保留):

包名升级前版本升级后版本官方简介
brotli1.0.01.0.2Python binding of the Brotli compression library
cloudpickle0.4.10.5.2Extended pickling support for Python objects
dask0.15.40.17.2Minimal task scheduling abstraction
jedi0.11.00.11.1An autocompletion tool for Python that can be used for text editors
parso0.1.00.1.1A Python Parser
pip9.0.19.0.3A tool for installing and managing Python packages
pyodbc4.0.194.0.22DB API Module for ODBC
python_snappy0.5.10.5.2Python library for the snappy compression library from Google
setuptools36.6.039.0.1Download, build, install, upgrade, and uninstall Python packages - easily
toolz0.8.20.9.0List processing tools and functional utilities
winpython1.9.201710311.10.20180404WinPython distribution tools, including WPPM (package manager)

对照该版本的包索引 WinPythonZero-32bit-3.5.4.2.md 可知,3.5.4.2Zero 内置 27 个 Python 包,其中 Python 解释器版本为3.5.4,其余未在本变更列表中的包(如 docopt 0.6.2、idlex 1.13、joblib 0.11、locket 0.2.0、partd 0.3.8、prompt_toolkit 1.0.15、ptpython 0.41、pygments 2.2.0、pyreadline 2.0、pythonnet 2.4.0.dev0、six 1.11.0、sqlite_bro 0.8.11、wcwidth 0.1.7)均为从上一版本延续、版本未发生变动的组件。

2.1 升级包分组解读

按功能用途,可将这 11 个升级包归纳为四类,便于理解该版本的演进意图:

  • Python 包管理基础设施:pip(9.0.1 → 9.0.3)、setuptools(36.6.0 → 39.0.1)。这两者是整个发行版安装、管理第三方包的底座,版本跨度最大,尤其是 setuptools 跨越了 36.x 到 39.x 三个大版本段;
  • WinPython 发行版自身工具:winpython(1.9.20171031 → 1.10.20180404)。该包即仓库 README.rst 所描述的 WinPython distribution tools,内含 WPPM(WinPython Package Manager),版本号采用主版本.年份+日期的日期型命名,本次从 2017-10-31 构建升级到 2018-04-04 构建;
  • 分布式计算与并行序列化生态:dask(0.15.4 → 0.17.2)、cloudpickle(0.4.1 → 0.5.2)、toolz(0.8.2 → 0.9.0)。dask 是“Minimal task scheduling abstraction”,cloudpickle 为其提供跨解释器的对象序列化能力,toolz 提供函数式工具支撑;
  • 压缩与数据接入:brotli(1.0.0 → 1.0.2)、python_snappy(0.5.1 → 0.5.2)、pyodbc(4.0.19 → 4.0.22)。分别覆盖 Brotli、Snappy 两种压缩算法以及 ODBC 数据库访问;
  • Python 开发体验组件:jedi(0.11.0 → 0.11.1)、parso(0.1.0 → 0.1.1)。jedi 是编辑器自动补全引擎,parso 是其底层 Python 解析器,两者通常同步升级。

2.2 与 3.5.4.0Zero 的版本脉络对照

若将视野拉长一个版本,可对照 WinPythonZero-32bit-3.5.4.0_History.md:3.5.4.0Zero 相比 3.5.3.1Zero 属于功能面较大的发布,新增了 brotli、cloudpickle、dask、joblib、locket、partd、pyreadline、python_snappy、toolz 九个包,移除 appdirs、packaging、pyparsing 三个包,并升级了 Python 解释器 3.5.3 → 3.5.4。而 3.5.4.2Zero 则是在 3.5.4.1Zero 基础上的纯升级维护版,包集合保持不变——这一对比也印证了 WinPython “同一次 Python 小版本内,通过多次4.x迭代收敛包版本”的发布节奏。

三、Zero风味标记与 32 位架构的语义

本文档文件名中的Zero与32bit是理解该发行版定位的两个关键标记:

  • Zero(零版)风味:WinPython 有多个并行风味(flavor),如常规版、slim、dot、Zero等。从包索引可以看到,Zero 版不包含任何 Tools 工具(其 “Tools” 表格为空),Python 包也只保留约 27 个最小集合,且未包含 NumPy/SciPy 等科学计算栈,属于面向“零配置、轻量携带”场景的极简发行版。这一命名规律与当前构建配置 winpython_builds.toml 中[flavors.*]按requirements/toolsdirs区分各风味的做法一脉相承——风味决定该发行版内置哪些包、携带哪些工具;
  • 32bit:指 Python 解释器为 32 位架构。WinPython 长期并行维护 32 位与 64 位两条发行线(changelogs 目录中即有大量-32bit-与-64bit-文件),且从 wppm/diff.py 的compare_package_indexes(version2, version1, searchdir, flavor, architecture=64)签名可以看出,架构是版本对比的独立维度:32 位与 64 位各自维护独立的包索引与历史记录。

需要说明的适用前提:本版本基于 Python 3.5.4,已是较老的解释器代次,其包版本(如 pip 9.x、setuptools 39.x)与现代 Python 生态存在差异;阅读本文的包版本信息时应以“3.5.x 时代的历史发行版”为语境理解。

四、这份变更记录本身:格式规范与数据来源

4.1 结构骨架

_History.md的正文结构固定为:

  1. H2 标题:## History of changes for WinPython-32bit 3.5.4.2Zero;
  2. 基准说明句:The following changes were made to WinPython-32bit distribution since version 3.5.4.1Zero.——明确对比基准;
  3. 按### Python packages区块列出分类(本文仅存在Upgraded packages一类,用* name old → new (description)单行格式逐条列出);
  4. 以* * *分隔线收尾。

对比基准句中的since version 3.5.4.1Zero并不是手写的文字:从源码看,它由compare_package_indexes中的find_previous_version依据changelogs目录内文件名解析出版本序列后自动确定(详见第五节)。

4.2 数据来源:包索引

变更记录中每个包的“简介”列,直接取自包索引清单(如 WinPythonZero-32bit-3.5.4.2.md 中Name | Version | Description三列)。包索引本身又是从已安装发行版实时生成的:wppm/wppm.py中的Distribution.get_installed_packages()调用pip list --format=full枚举已装包,再经由render_markdown_for_list渲染为与文档完全一致的三列表格。也就是说,本文档的“信息链”是:已安装发行版 → pip 枚举 → 包索引 Markdown → 版本对比 → 变更记录。

五、仓库源码级原理:_History.md是如何被自动生成的

这是本文最有价值的部分——通过阅读 wppm/diff.py 与 wppm/wppm.py,可以完整还原这份变更日志的生产过程。

5.1 核心调用链

wppm.diff模块对外提供两类入口:

  • 按文件对比:compare_files(file1, file2, mode="full"|"section"|"pairs"),直接对比两个包索引 Markdown 文件;
  • 按版本对比(生成 History 文件):compare_package_indexes(version2, version1=None, searchdir=None, flavor="", flavor1=None, architecture=64),自动定位上一版本后生成变更文本,再由write_changelog(version2, version1, ...)写入changelogs/WinPython{flavor}-{architecture}bit-{version2}_History.md。

对应到本文档,其生成路径即:write_changelog("3.5.4.2", "3.5.4.1", searchdir=changelogs目录, flavor="Zero", architecture=32)。compare_package_indexes生成的开头正是:

## History of changes for WinPython-{architecture}bit {version2 + flavor} The following changes were made to WinPython-{architecture}bit distribution since version {version1 + flavor1}.

与 WinPythonZero-32bit-3.5.4.2_History.md 文件内容逐字吻合,可确认本文档即该函数的标准输出。

5.2 上一版本如何确定:find_previous_version

compare_package_indexes未显式传入version1时,会调用find_previous_version(target_version, searchdir, flavor, architecture)自动寻找“最近的更早版本”。其实现要点:

  • 用正则WinPython{flavor}-{architecture}bit-(.+)\.(?:txt|md)$扫描changelogs目录,从文件名中提取版本号;
  • 用packaging.version.parse做 PEP 440 语义化解析与排序,而不是字符串前缀匹配(避免 “3.1” 误吞 “3.15”);
  • 过滤掉_History.md伴生文件(它们不是包索引,解析不成版本即被排除);
  • 在全部早于目标版本的候选里取最大者;若无更早版本,则回退为“与自身对比”(结果为空变更)。

对应测试见 tests/test_diff_versions.py:TestFindPreviousVersion覆盖了“取最近的更早版本”“release level(如 b1)参与排序”“不同 flavor 互不可见”“不同架构各自独立成线”等关键行为。对本文而言,flavor="Zero"保证了它只会与同为 Zero 风味的 3.5.4.1Zero 对比,而不会误选其他风味的版本。

5.3 变更分类逻辑:compare_packages

对比的核心在compare_packages(old, new):先将包名归一化(-→_、转小写),再做集合差与版本比较,产出三类结果:

  • New packages:new中存在、old中不存在的包;
  • Upgraded packages:两边都存在但版本号不同的包,格式为name old_version → new_version;
  • Removed packages:old中存在、new中消失的包。

这正是本文档中Upgraded packages列表的生成逻辑——本文档只有升级、没有新增与移除,说明 3.5.4.2Zero 与 3.5.4.1Zero 的包集合完全一致,仅在 11 个包的版本号上不同。解析与格式化依赖PackageIndex/Package两个辅助类:Package.from_text用正则\[([\w\-\:\/\.\_]+)\]\(([^)]+)\) \| ([^\|]*) \| ([^\|]*)解析包索引行,PackageIndex则按### Tools/### Python packages/### WheelHouse packages三个区块分桶。

5.4 如何复现/使用该机制(只读仓库中的实操方式)

该模块以python -m wppm.diff方式运行(wppm.diff的if __name__ == "__main__"分支,见 wppm/diff.py),常见用法:

# 对比两个包索引文件的所有区块(任意顺序、任意风味) python -m wppm.diff file1.md file2.md # 只对比某个区块:--section header1 header2 python -m wppm.diff file1.md file2.md --section python python # 按区块对对比:--pairs h1a h2a [h1b h2b ...] python -m wppm.diff file1.md file2.md --pairs python wheelhouse tools tools # 按版本对比(默认 flavor 为空、architecture 为 64) python -m wppm.diff <version2> <version1> [searchdir] [flavor] [architecture] # 把对比写入 _History.md 文件(并可复制到 basedir) python -m wppm.diff --write-changelog <version2> <version1> [searchdir] [flavor] [architecture] [basedir]

注意两处环境细节(源码中有明确处理):一是wppm.diff需要以包方式运行(相对导入依赖wppm包),直接python diff.py无法工作;二是 Windows 控制台默认编码为 cp1252,而升级列表使用→箭头字符,因此__main__分支开头会用sys.stdout.reconfigure(encoding="utf-8", errors="replace")强制 UTF-8 输出,避免“比较两个版本”演变成编码 Traceback。

若想亲手复现本文档,可执行:

python -m wppm.diff --write-changelog 3.5.4.2 3.5.4.1 changelogs Zero 32

即以flavor="Zero"、architecture=32对比 3.5.4.2 与 3.5.4.1 两份索引,并在changelogs目录生成对应的_History.md。这要求本机 Python 环境满足仓库 README.rst 声明的依赖(运行 wppm 需要 Python ≥ 3.10),且changelogs目录中同时存在 WinPythonZero-32bit-3.5.4.2.md 与 WinPythonZero-32bit-3.5.4.1.md 两份包索引。

5.5 当前仓库对_History.md的边界约定

值得补充的是,现代版本的仓库对_History.md伴生文件的态度已发生变化:新测试 tests/test_changelog_files.py 明确记录“No_History.mdcompanion is written”——新构建的产出只保留包索引(.md)、哈希清单与pylock/requir锁文件,而_History.md不再随每个构建自动生成;测试同时固定了parse_changelog_name必须拒绝WinPythonslim-64bit-3.15.0.5b1_History.md这类伴生文件,因为它不是包索引。也就是说,历史上(如本文档所在的 3.5.x 时代)_History.md是标准产出物,而现在改由读者按需执行wppm -diff a.md b.md自行对比。这一演进从侧面说明:本文档所代表的“版本间变更记录”能力并没有消失,只是从“静态文件”转型为“按需生成的动态工具”。

六、实操价值总结

  • 作为历史发行版的升级指南:本文档完整列出了 3.5.4.2Zero 相对 3.5.4.1Zero 的全部 11 个包升级明细,是升级到该版本前核对依赖变动的一手资料;
  • 作为 WinPython 变更日志格式的样例:它展示了_History.md的标准结构——对比基准句、分类列表(New / Upgraded / Removed)、* * *结尾;
  • 作为自动化工具链的输入输出示范:结合 wppm/diff.py 与 tests/test_diff_versions.py,可以完整复现“包索引 → 版本对比 → 变更日志”的生成流程,并理解 flavor / architecture 如何作为独立维度参与版本选择。

若需要继续深入,可依次阅读:包索引清单 WinPythonZero-32bit-3.5.4.2.md、对比实现 wppm/diff.py、索引渲染实现 wppm/wppm.py、以及版本定位测试 tests/test_diff_versions.py。

  • 开发工具
  • 构建工具
  • CLI
  • 包管理器

【免费下载链接】winpython

A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python.

项目地址:https://gitcode.com/gh_mirrors/wi/winpython
点击查看免费下载

相关推荐

上一篇:REFramework 上手指南:RE 引擎游戏加 VR 与自定义行为改造完整方案
下一篇:Qwen3.5-9B-Claude-4.6-Opus-Reasoning-Distilled-v2在实际应用中的表现:数学、编程、逻辑推理测试

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询