- 开发工具
- 构建工具
- CLI
- 包管理器
【免费下载链接】winpython
A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python.
本文以 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仅引入了一个全新包:
| 包名 | 版本 | 说明 |
|---|---|---|
| fsspec | 0.4.4 | File-system specification(文件系统抽象规范) |
fsspec 为本地文件系统、远程存储等各类数据源提供统一的 Python 文件接口抽象,其引入与本发行版中 dask 的升级方向一致——dask 的分布式/惰性计算通常需要统一的文件访问层来读写分块数据。
2.2 升级包清单
| 包名 | 原版本 | 新版本 | 说明 |
|---|---|---|---|
| dask | 2.1.0 | 2.4.0 | Minimal task scheduling abstraction(最小任务调度抽象) |
| jedi | 0.14.0 | 0.15.1 | An autocompletion tool for Python that can be used for text editors(Python 自动补全工具) |
| parso | 0.5.0 | 0.5.1 | A Python Parser(Python 语法解析器) |
| pip | 19.1.1 | 19.2.3 | A tool for installing and managing Python packages(Python 包安装与管理工具) |
| pyodbc | 4.0.26 | 4.0.27 | DB API Module for ODBC(ODBC 数据库 API 模块) |
| qtpy | 1.8.0 | 1.9.0 | Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets(Qt 绑定抽象层) |
| setuptools | 41.0.1 | 41.2.0 | Download, build, install, upgrade, and uninstall Python packages(Python 包构建与分发工具集) |
| wheel | 0.33.4 | 0.33.6 | A built-package format for Python(wheel 构建包格式) |
| winpython | 2.0.20190705 | 2.1.20190921 | WinPython distribution tools, including WPPM (package manager)(WinPython 发行工具,含 WPPM 包管理器) |
从整体结构看,这批升级覆盖了发行版的四条支撑线:
- 数据处理线:dask 2.1.0 → 2.4.0,配合新增的 fsspec,强化了并行/惰性计算与统一文件访问能力;
- 编辑器/补全线:jedi 0.14.0 → 0.15.1 与 parso 0.5.0 → 0.5.1 同步升级(parso 正是 jedi 所依赖的解析器,两者版本配套前进);
- 包管理线:pip 19.1.1 → 19.2.3、setuptools 41.0.1 → 41.2.0、wheel 0.33.4 → 0.33.6,三者构成“安装器 + 构建器 + 打包格式”的完整工具链升级;
- 数据库与桌面线: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 一节为空):
| 包名 | 版本 | 说明 |
|---|---|---|
| Python | 3.7.4 | Python programming language with standard library |
| brotli | 1.0.7 | Python binding of the Brotli compression library |
| cloudpickle | 1.2.1 | Extended pickling support for Python objects |
| dask | 2.4.0 | Minimal task scheduling abstraction |
| docopt | 0.6.2 | Pythonic argument parser, that will make you smile |
| fsspec | 0.4.4 | File-system specification |
| idlex | 1.18 | IDLE Extensions for Python |
| jedi | 0.15.1 | An autocompletion tool for Python that can be used for text editors |
| joblib | 0.13.2 | Lightweight pipelining: using Python functions as pipeline jobs |
| locket | 0.2.0 | File-based locks for Python for Linux and Windows |
| parso | 0.5.1 | A Python Parser |
| partd | 1.0.0 | Appendable key-value storage |
| pip | 19.2.3 | A tool for installing and managing Python packages |
| prompt_toolkit | 2.0.9 | Library for building powerful interactive command lines in Python |
| ptpython | 2.0.4 | Python REPL build on top of prompt_toolkit |
| pycosat | 0.6.3 | bindings to picosat (a SAT solver) |
| pygments | 2.4.2 | Generic syntax highlighter for general use in all kinds of software |
| pyodbc | 4.0.27 | DB API Module for ODBC |
| python_snappy | 0.5.4 | Python library for the snappy compression library from Google |
| pythonnet | 2.4.0 | .Net and Mono integration for Python |
| qtpy | 1.9.0 | Qt bindings abstraction layer |
| setuptools | 41.2.0 | Download, build, install, upgrade, and uninstall Python packages |
| six | 1.12.0 | Python 2 and 3 compatibility utilities |
| sqlite_bro | 0.9.1 | a graphic SQLite Client in 1 Python file |
| toolz | 0.10.0 | List processing tools and functional utilities |
| wcwidth | 0.1.7 | Measures number of Terminal column cells of wide-character codes |
| wheel | 0.33.6 | A built-package format for Python |
| winpython | 2.1.20190921 | WinPython 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 pythondiff.py支持的三种模式(见其print_usage,wppm/diff.py):
| 模式 | 命令形式 | 用途 |
|---|---|---|
| full(默认) | wppm -diff a.md b.md | 对比两个索引的全部三个分节(Tools / Python packages / WheelHouse) |
| section | python -m wppm.diff a.md b.md --section h1 h2 | 只对比指定分节 |
| pairs | python -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.
相关推荐
WinPython Zero 32bit 3.7.4.1 版本解析:Barebone 精简分发的包清单、变更记录与 changelog 生成机制
WinPython Zero 32bit 3.7.4.1 版本解析:Barebone 精简分发的包清单、变更记录与 changelog 生成机制 WinPyth
开发工具构建工具CLI包管理器WinPython-32bit 3.7.4.1 发行历史全解析:从 fsspec、jupyter_server 到 pandas 0.25 的版本升级全景
WinPython 32bit 3.7.4.1 发行历史全解析:从 fsspec、jupyter_server 到 pandas 0.25 的版本升级全景 本指
开发工具构建工具CLI包管理器WinPython-64bit 3.7.4.1 变更历史全解析:包升级清单与 History 文档的生成机制
WinPython 64bit 3.7.4.1 变更历史全解析:包升级清单与 History 文档的生成机制 本篇技术指南以仓库中的官方变更历史文档 chang
开发工具构建工具CLI包管理器
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考