☰
WinPython Zero 发行版 3.7.4.1(32bit)变更日志解读:从 History 文件看 Python 包的升级脉络
2026/10/16 5:33:28 网站建设 项目流程
  • 开发工具
  • 构建工具
  • 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.7.4.1_History.md 为核心素材,系统解读 WinPython 32bit 3.7.4.1 Zero 发行版相对上一版本的全部包级变更(新增与升级),并结合同版本软件包索引、上一版本历史以及wppm包管理器生成/对比该类文档的源码实现,说明这类_History.md文件是如何被程序化生成、其行文格式的底层规则,以及读者如何自行复现“两个发行版之间的差异分析”。

一、WinPython Zero 发行版与 3.7.4.1 的版本脉络

WinPython 是面向 Windows 平台的便携式 Python 发行版,将 CPython 与一批预编译科学计算包打包在一起。历史发行版按“风味(flavor)+ 架构 + 版本号”命名,例如本主题对应的文件名为WinPythonZero-32bit-3.7.4.1,其中:

  • Zero是当时该构建所采用的风味名称(类似当前仓库中 winpython_builds.toml 所定义的dot、slim、dotf、slimf等风味,不同风味对应不同的包集合与工具目录);
  • 32bit表示发行版架构为 32 位;
  • 3.7.4.1是 WinPython 自身的版本号,其含义可理解为Python 3.7.4基础上的第 1 次构建。

从 winpython/make.py 的winpython_version_name属性可以看到,WinPython 的完整版本字符串由{python_full_version}.{build_number}{flavor}{release_level}拼接而成,即“Python 完整版本号 + 构建号 + 风味名 + 发布级别”,这与3.7.4.1Zero的命名结构完全对应。

在变更时间线上,3.7.4.1 Zero的上一个版本是3.7.4.0 Zero。对照 3.7.4.0 的历史文件 可知,3.7.4.0相对更早的3.7.2.0曾一次性完成了 Python 3.7.2 → 3.7.4 的运行时升级,以及 cloudpickle、dask、jedi、pip、qtpy、setuptools、wheel、winpython 工具包等十余个包的批量升级,还引入了 pycosat(SAT 求解器绑定)。因此3.7.4.1是在全新 Python 3.7.4 基座上的第二次增量迭代,变更量相对收敛。

二、核心变更内容:1 个新包 + 9 个升级包

本节的全部数据均直接来自 WinPythonZero-32bit-3.7.4.1_History.md,是其“New packages / Upgraded packages”两部分的完整继承。

2.1 新增包:fsspec 0.4.4

3.7.4.1 Zero仅引入了一个全新包:

包名版本说明
fsspec0.4.4File-system specification(文件系统抽象规范)

fsspec 为本地文件系统、远程存储等各类数据源提供统一的 Python 文件接口抽象,其引入与本发行版中 dask 的升级方向一致——dask 的分布式/惰性计算通常需要统一的文件访问层来读写分块数据。

2.2 升级包清单

包名原版本新版本说明
dask2.1.02.4.0Minimal task scheduling abstraction(最小任务调度抽象)
jedi0.14.00.15.1An autocompletion tool for Python that can be used for text editors(Python 自动补全工具)
parso0.5.00.5.1A Python Parser(Python 语法解析器)
pip19.1.119.2.3A tool for installing and managing Python packages(Python 包安装与管理工具)
pyodbc4.0.264.0.27DB API Module for ODBC(ODBC 数据库 API 模块)
qtpy1.8.01.9.0Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets(Qt 绑定抽象层)
setuptools41.0.141.2.0Download, build, install, upgrade, and uninstall Python packages(Python 包构建与分发工具集)
wheel0.33.40.33.6A built-package format for Python(wheel 构建包格式)
winpython2.0.201907052.1.20190921WinPython distribution tools, including WPPM (package manager)(WinPython 发行工具,含 WPPM 包管理器)

从整体结构看,这批升级覆盖了发行版的四条支撑线:

  1. 数据处理线:dask 2.1.0 → 2.4.0,配合新增的 fsspec,强化了并行/惰性计算与统一文件访问能力;
  2. 编辑器/补全线:jedi 0.14.0 → 0.15.1 与 parso 0.5.0 → 0.5.1 同步升级(parso 正是 jedi 所依赖的解析器,两者版本配套前进);
  3. 包管理线:pip 19.1.1 → 19.2.3、setuptools 41.0.1 → 41.2.0、wheel 0.33.4 → 0.33.6,三者构成“安装器 + 构建器 + 打包格式”的完整工具链升级;
  4. 数据库与桌面线:pyodbc 4.0.26 → 4.0.27(ODBC 数据访问)、qtpy 1.8.0 → 1.9.0(Qt 绑定抽象层),后者为基于 PyQt5/PySide 的桌面应用提供兼容层。

值得注意的还有winpython 工具包从 2.0.20190705 升级到 2.1.20190921。该包即 WinPython 发行工具(含 WPPM——WinPython Package Manager),其实现对应本仓库的 wppm/ 目录;也就是说,这份发行版自带的包管理器版本在本次迭代中完成了跨大版本的更新,这也直接关系到底下第三节介绍的变更日志生成能力。

2.3 该版本发行版的完整软件包索引

为了更完整地呈现 3.7.4.1 Zero 的实际构成,此处给出同版本软件包索引中的全部 Python 包(Tools 一节为空):

包名版本说明
Python3.7.4Python programming language with standard library
brotli1.0.7Python binding of the Brotli compression library
cloudpickle1.2.1Extended pickling support for Python objects
dask2.4.0Minimal task scheduling abstraction
docopt0.6.2Pythonic argument parser, that will make you smile
fsspec0.4.4File-system specification
idlex1.18IDLE Extensions for Python
jedi0.15.1An autocompletion tool for Python that can be used for text editors
joblib0.13.2Lightweight pipelining: using Python functions as pipeline jobs
locket0.2.0File-based locks for Python for Linux and Windows
parso0.5.1A Python Parser
partd1.0.0Appendable key-value storage
pip19.2.3A tool for installing and managing Python packages
prompt_toolkit2.0.9Library for building powerful interactive command lines in Python
ptpython2.0.4Python REPL build on top of prompt_toolkit
pycosat0.6.3bindings to picosat (a SAT solver)
pygments2.4.2Generic syntax highlighter for general use in all kinds of software
pyodbc4.0.27DB API Module for ODBC
python_snappy0.5.4Python library for the snappy compression library from Google
pythonnet2.4.0.Net and Mono integration for Python
qtpy1.9.0Qt bindings abstraction layer
setuptools41.2.0Download, build, install, upgrade, and uninstall Python packages
six1.12.0Python 2 and 3 compatibility utilities
sqlite_bro0.9.1a graphic SQLite Client in 1 Python file
toolz0.10.0List processing tools and functional utilities
wcwidth0.1.7Measures number of Terminal column cells of wide-character codes
wheel0.33.6A built-package format for Python
winpython2.1.20190921WinPython distribution tools, including WPPM (package manager)

从索引中可以看到,该发行版以 Dask 数据处理栈(dask、fsspec、partd、locket、toolz、cloudpickle、joblib)为核心特色,同时内置 ptpython/prompt_toolkit(交互式 REPL)、pythonnet(.NET 互操作)、pyodbc(ODBC 数据库)与 sqlite_bro(SQLite 图形客户端),是一个面向数据处理场景的 32 位精简发行版。

三、这类 _History.md 文件是如何生成的:wppm.diff 的源码实现

WinPythonZero-32bit-3.7.4.1_History.md不是手写文档,而是 WinPython 工具链程序化对比两个版本索引后生成的产物。生成逻辑位于 wppm/diff.py,核心链路如下:

3.1 索引文件的行格式解析

每个版本的完整包索引(如 WinPythonZero-32bit-3.7.4.1.md)本质上是一份结构化 Markdown:以### Tools、### Python packages、### WheelHouse packages分节(见diff.py中PackageIndex.HEADERS的定义),每行包的格式为name | version | description。Package类通过正则\[([\w\-\:\/\.\_]+)\]\(([^)]+)\) \| ([^\|]*) \| ([^\|]*)解析每一行(wppm/diff.py),得到名称、URL、版本与描述四个字段。

3.2 差异计算:New / Upgraded / Removed 三段式

compare_packages(wppm/diff.py)以包名(标准化为小写并替换-为_)为键做新旧两个索引的集合比较,输出三个段落:

  • New packages:仅出现在新索引中的包,格式为* {name} {version} ({description});
  • Upgraded packages:两个索引都有但版本不同的包,格式为* {name} {old_version} → {new_version} ({description});
  • Removed packages:仅出现在旧索引中的包。

3.7.4.1 的历史文件没有出现“Removed packages”段,说明本次迭代没有移除任何包;这与 3.7.4.0 的历史文件 的格式完全一致——都是“New packages + Upgraded packages”两段。

3.3 文件头与落盘:compare_package_indexes / write_changelog

compare_package_indexes(wppm/diff.py)负责生成历史文件的开头:

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

对照本文关联文档,version2 + flavor即3.7.4.1 + Zero,version1 + flavor1即3.7.4.0 + Zero。而write_changelog(wppm/diff.py)最终把结果写入changelogs/WinPython{flavor}-{architecture}bit-{version2}_History.md——这正是WinPythonZero-32bit-3.7.4.1_History.md的命名来源。其中“上一个版本”由find_previous_version根据 changelogs 目录中的文件名解析得出(wppm/diff.py),它只比较同一风味、同一架构下的版本,不会跨 flavor 或跨 32/64 位去对比。

3.4 一个实现细节:升级箭头与 Windows 编码

历史文件中升级行使用→箭头(如2.1.0 → 2.4.0)。在 wppm/diff.py 与 wppm/wppm.py 的入口处都显式执行了sys.stdout.reconfigure(encoding="utf-8", errors="replace")——因为 Windows 控制台默认代码页是 cp1252,如果不强制 UTF-8,打印“升级箭头”时会把整次对比变成 traceback。这一细节解释了为什么该历史文件中的箭头能正确呈现,也提示任何在 Windows 下复现 diff 输出时都要关注编码。

四、实战:自行复现两个发行版之间的差异

虽然仓库中已归档了_History.md历史文件,但wppm提供了更灵活的对比方式——任意选择两个包索引文件做差异分析。这正是 wppm/wppm.py 中-diff参数的用途,其帮助文本明确指出:任何两个发行版或风味都可以对比,无需是相邻版本。

例如,在仓库根目录执行:

# 对比 3.7.4.1 与 3.7.4.0 两个 Zero 32bit 版本(结果即本文关联文档的内容) wppm -diff changelogs/WinPythonZero-32bit-3.7.4.1.md changelogs/WinPythonZero-32bit-3.7.4.0.md # 等价形式(不安装 wppm,直接用模块运行) python -m wppm.diff changelogs/WinPythonZero-32bit-3.7.4.1.md changelogs/WinPythonZero-32bit-3.7.4.0.md # 也可以只对比某个分节(如仅对比 Python packages 节) python -m wppm.diff changelogs/WinPythonZero-32bit-3.7.4.1.md changelogs/WinPythonZero-32bit-3.7.4.0.md --section python python

diff.py支持的三种模式(见其print_usage,wppm/diff.py):

模式命令形式用途
full(默认)wppm -diff a.md b.md对比两个索引的全部三个分节(Tools / Python packages / WheelHouse)
sectionpython -m wppm.diff a.md b.md --section h1 h2只对比指定分节
pairspython -m wppm.diff a.md b.md --pairs h1a h2a [h1b h2b ...]按指定分节对逐一对比
版本模式python -m wppm.diff <version2> <version1> [searchdir] [flavor] [architecture]按版本号从 changelogs 目录读取对比
写文件模式python -m wppm.diff --write-changelog <version2> <version1> ...将对比结果写入_History.md并可选复制到目标目录

此外,wppm -md(wppm/wppm.py)可以从目标 Python 发行版直接生成 Markdown 格式的包索引,-md配合-ws还可对比“已安装包”与“WheelHouse 收录包”两个集合(compare_markdown_sections(default, compare, 'python', 'wheelhouse', ...)),是构建期生成这类索引文件的底层能力。相关回归测试见 tests/test_distribution.py(验证-md读取的是目标发行版而非运行解释器自身)。

五、当前仓库对“历史文件”的新约定:用 wppm -diff 取代历史链

值得注意的是,仓库对_History.md这类文件的态度在 tests/test_changelog_files.py 中有明确说明:新构建不再为每个版本生成_History.md配套文件。原因写在该测试模块的 docstring 中——历史文件是与“紧邻的上一个版本”对比,而风味(flavor)在各发布周期之间会来去变化,读者通常一年只升级一次,这样的链式对比“不携带意义”;真正需要的对比,是读者自行选择任意两个索引文件,通过wppm -diff a.md b.md完成。

同时,tests/test_diff_versions.py 还固化了历史文件命名与版本解析的规则:_History.md不会被当作版本文件参与对比(test_history_companions_are_never_the_answer),32 位与 64 位是两条独立线(test_architecture_separates_the_lines),dot不能匹配dotf(test_a_flavor_is_not_a_prefix_of_another)。这些规则解释了为什么WinPythonZero-32bit-3.7.4.1_History.md与WinPythonZero-32bit-3.7.4.1.md会成对出现在 changelogs/ 目录中,且前者不会干扰后者参与版本比较。

因此,对读者而言,changelogs/目录中的历史文件是过去发行足迹的静态档案;而要在当下快速回答“某两个 WinPython 版本/风味之间包有哪些变化”,首选工具是wppm -diff。

六、小结

WinPythonZero-32bit-3.7.4.1_History.md这份历史文件记录了 WinPython 32bit 3.7.4.1 Zero 相对 3.7.4.0 的全部包级变化:新增 fsspec 0.4.4,升级 dask、jedi、parso、pip、pyodbc、qtpy、setuptools、wheel、winpython 共 9 个包,无包被移除。通过同版本包索引可以还原该发行版的完整构成,而通过 wppm/diff.py 与 wppm/wppm.py 的源码可以理解这类历史文件的生成机制——从索引行解析、三段式差异计算、版本查找,到_History.md落盘与编码处理。若想获得任何两个发行版之间的即时差异报告,直接使用wppm -diff即可,无需等待仓库归档历史文件。

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

【免费下载链接】winpython

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

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

相关推荐

上一篇:探索 SQLBrite:轻量级的 SQLite ORM 库
下一篇:终极Browserify指南:快速掌握JavaScript模块化打包技巧 🚀

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

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

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

立即咨询