- 开发工具
- 构建工具
- CLI
- 包管理器
【免费下载链接】winpython
A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python.
本文以 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 个包在本次版本中完成了升级(原文档列表,完整保留):
| 包名 | 升级前版本 | 升级后版本 | 官方简介 |
|---|---|---|---|
| brotli | 1.0.0 | 1.0.2 | Python binding of the Brotli compression library |
| cloudpickle | 0.4.1 | 0.5.2 | Extended pickling support for Python objects |
| dask | 0.15.4 | 0.17.2 | Minimal task scheduling abstraction |
| jedi | 0.11.0 | 0.11.1 | An autocompletion tool for Python that can be used for text editors |
| parso | 0.1.0 | 0.1.1 | A Python Parser |
| pip | 9.0.1 | 9.0.3 | A tool for installing and managing Python packages |
| pyodbc | 4.0.19 | 4.0.22 | DB API Module for ODBC |
| python_snappy | 0.5.1 | 0.5.2 | Python library for the snappy compression library from Google |
| setuptools | 36.6.0 | 39.0.1 | Download, build, install, upgrade, and uninstall Python packages - easily |
| toolz | 0.8.2 | 0.9.0 | List processing tools and functional utilities |
| winpython | 1.9.20171031 | 1.10.20180404 | WinPython 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的正文结构固定为:
- H2 标题:
## History of changes for WinPython-32bit 3.5.4.2Zero; - 基准说明句:
The following changes were made to WinPython-32bit distribution since version 3.5.4.1Zero.——明确对比基准; - 按
### Python packages区块列出分类(本文仅存在Upgraded packages一类,用* name old → new (description)单行格式逐条列出); - 以
* * *分隔线收尾。
对比基准句中的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.
相关推荐
WinPython 3.5.2.2 版本更新全解析:从变更清单到 changelog 自动生成机制
WinPython 3.5.2.2 版本更新全解析:从变更清单到 changelog 自动生成机制 本篇技术指南以 changelogs/WinPython 3
开发工具构建工具CLI包管理器WinPython 3.5.2.1 版本变更全解析:新增/升级/移除包清单与 Changelog 自动生成机制
WinPython 3.5.2.1 版本变更全解析:新增/升级/移除包清单与 Changelog 自动生成机制 本文以 WinPython 仓库发布的 WinP
开发工具构建工具CLI包管理器深入解析 Remote In Tech 目录中的 Chroma 公司档案:全远程 UI 组件测试团队的数据与工作流
深入解析 Remote In Tech 目录中的 Chroma 公司档案:全远程 UI 组件测试团队的数据与工作流 导读 Chroma 是远程技术公司目录(Re
开发工具构建工具CLI包管理器
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考