WinPython 2.7.5.2 版本变更全解:科学计算包升级脉络与 changelog 生成机制
WinPython 2.7.5.2 版本变更全解:科学计算包升级脉络与 changelog 生成机制
WinPython 2.7.5.2 是基于 Python 2.7.5 的 Windows 便携式科学计算发行版,本文以仓库内变更记录 changelogs/WinPython-2.7.5.2_History.md 为主体,逐项解读该版本相对 2.7.5.0 的包增删与升级(7 个新增包、19 个升级包、1 个移除包),并结合 wppm/diff.py 源码说明这类"History"文档是如何被自动解析、比对与生成的。读完本文,你既能掌握 2.7.5.2 的完整变更清单与生态演进逻辑,也能学会用 wppm 自带的 diff 工具复现任意两个版本(或任意两个包清单文件)之间的差异。
一、版本背景:2.7.5.0 → 2.7.5.2 的变更范围
该 History 文档开篇即声明:本文档记录的是 WinPython 发行版自 2.7.5.0 以来所做的变更。对照两份配套文件可以确认变更范围:
- 工具层(Tools)完全不变:gettext 0.14.4、SciTE 3.2.3、TortoiseHg 2.8、MinGW32 4.6.2 在 changelogs/WinPython-2.7.5.0.md 与 changelogs/WinPython-2.7.5.2.md 中保持一致,其中 MinGW32 仅存在于 32 位版本;
- Python 解释器本体同为 2.7.5,也未升级;
- 全部变更集中在 Python 包层面:新增 7 个、升级 19 个、移除 1 个。
需要说明的是,仓库的 changelogs 目录中不存在 2.7.5.1 的变更记录文件,因此 2.7.5.2 的对比基准就是 2.7.5.0。这一"取早于目标版本的最近一个版本作为对比基准"的行为,正对应 wppm/diff.py 中 find_previous_version 的实现逻辑(详见下文第五节)。
二、新增包:7 个新成员补齐依赖与统计生态
2.7.5.2 一次性引入了 7 个新包,其中多数是本次升级包的直接依赖,呈现出"依赖先行"的打包顺序:
| 包名 | 版本 | 用途 |
|---|---|---|
| MarkupSafe | 0.18 | 实现 XML/HTML/XHTML 安全字符串转义(Jinja2 模板引擎的核心依赖) |
| pyparsing | 2.0.1 | Python 解析模块(matplotlib 文本解析依赖) |
| python-dateutil | 1.5 | 对标准库 datetime 模块的强大扩展(pandas 时间序列依赖) |
| pytz | 2013b | 世界时区定义库(pandas 时区处理依赖) |
| setuptools | 0.9.8 | 下载、构建、安装、升级、卸载 Python 包(接替 distribute) |
| six | 1.3.0 | Python 2 与 Python 3 兼容工具库 |
| statsmodels | 0.5.0 | 基于 SciPy 的统计计算与统计模型库 |
逐个来看其生态定位:
- MarkupSafe + pyparsing + python-dateutil + pytz:四个依赖型包都是为升级主包铺路。Jinja2 2.7 → 2.7.1 需要 MarkupSafe;matplotlib 1.2.1 → 1.3.0 需要 pyparsing;pandas 0.11.0 → 0.12.0 需要 python-dateutil 与 pytz 完成时间序列与时区处理。这种"先补依赖、再升主包"的顺序,保证了发行版内包与包之间版本自洽。
- six:当时 Python 3 已发布多年(WinPython 同期维护 2.7 与 3.3 两条主线),six 作为 Py2/Py3 兼容层被大量第三方包依赖,纳入发行版能减少后续升级的兼容性摩擦。
- setuptools:接替被移除的 distribute(详见第四节),承担包构建与安装基础设施角色。
- statsmodels 0.5.0:补上了 SciPy 之上的统计建模能力(回归、时间序列分析、假设检验等),使发行版从"数值计算"向"统计建模"延伸。
三、升级包:19 项关键升级的看点
2.7.5.2 的 19 个升级包可按领域归类:
3.1 科学计算核心四件套
| 包名 | 版本变化 | 说明 |
|---|---|---|
| matplotlib | 1.2.1 → 1.3.0 | 2D 绘图库(可嵌入 PyQt 等 GUI),升级跨度较大 |
| pandas | 0.11.0 → 0.12.0 | 数据分析、时间序列与统计数据结构 |
| scikit-learn | 0.13.1 → 0.14.1 | 机器学习与数据挖掘模块集 |
| sympy | 0.7.2 → 0.7.3 | 符号数学库 |
| tables | 3.0.0rc2 → 3.0.0 | 基于 HDF5 的分层大数据集管理,由 RC 候选版转为正式版 |
| statsmodels | (新增)0.5.0 | 统计模型库(见第二节) |
其中 tables 3.0.0rc2 → 3.0.0 是典型的"RC 转正式"升级,说明 2.7.5.2 在追求新功能的同时也注重稳定性收敛。
3.2 数据、图像与可视化
- networkx 1.7 → 1.8.1:图与网络创建、操作库;
- guiqwt 2.3.0 → 2.3.1:面向科学数据处理的高效曲线/图像绘图 GUI 工具;
- mahotas 1.0 → 1.0.2:计算机视觉库;
- Pillow 2.0.0 → 2.1.0:Python Imaging Library 的 fork,图像处理基础库;
- pydicom 0.9.7 → 0.9.8:纯 Python 处理 DICOM 医学影像文件。
3.3 GUI、开发环境与桌面工具
- PySide 1.1.2 → 1.2.0:跨平台 GUI 工具包 Qt 的 Python 绑定(与 PyQt 4.9.6-1 并存,供不同授权需求的用户选择);
- spyder 2.2.0 → 2.2.2:WinPython 默认的科学 Python 集成开发环境,面向交互式计算与数据可视化;
- psutil 0.7.1 → 1.0.1:跨平台获取进程信息与系统资源占用(CPU、磁盘、内存、网络),由 0.7.x 跨入 1.0 大版本;
- winpython 0.14 → 0.16:WinPython 发行版自带工具,含 WPPM 包管理器,与发行版本体同步演进。
3.4 打包、文档与模板
- pip 1.3.1 → 1.4.1:Python 包安装与管理工具,其升级直接影响用户在发行版内安装第三方包的能力;
- pywin32 218 → 218.4:Windows 平台 Python 扩展库,218 与 218.4 均为其内部版本号体系;
- Jinja2 2.7 → 2.7.1:沙箱化模板引擎;
- docutils 0.10 → 0.11:将纯文本文档(含 reStructuredText)处理为 HTML/LaTeX 等格式的文本处理系统,是 Sphinx 文档体系的基础;
- Scidoc 1.7.1 → 1.7.1.1:安装 NumPy、SciPy 等科学库的离线文档。
四、移除包:distribute 谢幕,setuptools 接棒
本版本唯一被移除的包是 distribute 0.6.40(下载、构建、安装、升级、卸载 Python 包的工具)。与之对应的,是新增列表中的 setuptools 0.9.8。
这是 Python 打包生态的一段重要历史:distribute 曾是 setuptools 的分叉,两者在 2013 年重新合并,distribute 停止独立发布,功能并入 setuptools。WinPython 2.7.5.2 正是跟随这一生态变化——移除 distribute、引入 setuptools,功能描述几乎一一对应("Download, build, install, upgrade, and uninstall Python packages - easily")。从源码结构看,这种"一删一增"的成对操作在后续版本的 History 文档中也反复出现,是 WinPython 保持打包基础设施与上游生态同步的常规手段。
五、这些变更记录是怎么生成的:源码级解读
仓库中的 _History.md 并非手写,而是由 wppm/diff.py 对两份"包索引"文件做结构化比对后生成的。理解其机制,就能明白本文档三段结构(New / Upgraded / Removed)的由来。
5.1 索引解析:Package 与 PackageIndex
wppm/diff.py 中定义了两条包行解析正则(Package.PATTERNS),用于兼容两种历史格式:
\[([\w\-\:\/\.\_]+)\]\(([^)]+)\) \| ([^\|]*) \| ([^\|]*)—— SourceForge 风格的name | version | description;\[([\w\-\:\/\.\_]+) ([^\]\ ]+)\] \| ([^\|]*) \| ([^\|]*)—— Google Code 风格的[name version] | version | description。
PackageIndex._parse_index 则按 ### Tools、### Python packages、### WheelHouse packages 三个小节头切分内容,逐行解析出 {name: Package} 映射——这与本 History 文档只展示"Python packages"小节、而同版本 changelogs/WinPython-2.7.5.2.md 含 Tools / Python packages 两小节的目录结构完全对应。
5.2 三段式差异:compare_packages
核心比对函数 compare_packages(old, new) 的逻辑如下:
- New packages:存在于新索引、不存在于旧索引的包(key 归一化为小写并将
-替换为_); - Upgraded packages:两索引都有但版本字符串不同的包,输出格式为
旧版本 → 新版本; - Removed packages:存在于旧索引、不存在于新索引的包。
added = [new[k] for k in new if k not in old]
upgraded = [new[k] for k in new if k in old and new[k].version != old[k].version]
removed = [old[k] for k in old if k not in new]
对照本文档即可验证:7 个 New、19 个 Upgraded、1 个 Removed 正是 compare_packages 对 2.7.5.0 与 2.7.5.2 两份索引逐行比对的结果。
5.3 版本对比基准:find_previous_version
changelog_versions(searchdir, flavor, architecture) 用正则 WinPython{flavor}-{architecture}bit-(.+)\.(?:txt|md)$ 从 changelogs 目录的文件名中提取版本号(交由 packaging.version 解析,兼容 b1、rc1、post1 等 PEP 440 版本级别),随后 find_previous_version 选出"早于目标版本的最近版本"作为对比基准。测试 tests/test_diff_versions.py 中的用例 test_history_companions_are_never_the_answer 还专门验证了:_History.md 配套文件永远不会被当作对比基准,只有正式索引文件(如 WinPython-2.7.5.0.md)才算数。
5.4 生成入口:write_changelog
write_changelog(version2, version1, ...) 负责把比对结果写成 WinPython{flavor}-{architecture}bit-{version2}_History.md,文档头 ## History of changes for WinPython-{architecture}bit {version2} 以及结尾 * * * 分隔符均由 compare_package_indexes 统一拼接——本文件头部 "== History of changes for WinPython 2.7.5.2 ==" 正是该模板的早期形态。
六、实战:如何自行生成与核对历史变更记录
基于 wppm/diff.py 的命令行接口,你可以随时复现、验证任何两个版本(或任意两份包清单)之间的差异。常用用法如下(命令在当前仓库根目录执行,changelogs 目录默认即 changelogs/):
# 按版本号对比:python -m wppm.diff <version2> <version1> [searchdir] [flavor] [architecture]
python -m wppm.diff 2.7.5.2 2.7.5.0 changelogs "" 64
# 不指定 version1 时,自动以"早于 version2 的最近版本"为基准
python -m wppm.diff 2.7.5.2
# 直接对比任意两份包索引文件(含跨 flavor、跨架构)
python -m wppm.diff file1.md file2.md
python -m wppm.diff file1.md file2.md --section python python
python -m wppm.diff file1.md file2.md --pairs python python tools tools
# 把比对结果写入 _History.md 文件(可指定 basedir 一并复制相关 changelog)
python -m wppm.diff --write-changelog 2.7.5.2 2.7.5.0
其中 wppm -diff file1.md file2.md 是短别名入口(见 wppm/main.py)。另外注意 wppm/diff.py 在 Windows 控制台运行时会主动将 stdout 重配置为 UTF-8,避免 → 升级箭头在 cp1252 编码下触发编码异常——这也是对比 2.7.5.0 → 2.7.5.2 这类含升级箭头的输出时能正常显示的原因。
七、从 2.7.5.2 看 WinPython 的生态定位
纵观 2.7.5.2 的变更,可以清晰看到 WinPython 作为 Windows 便携式科学计算发行版的选包与维护策略:
- 科学计算主链完整:numpy-MKL 1.7.1、scipy 0.12.0 保持基线稳定,其上持续升级 matplotlib、pandas、scikit-learn、sympy,并新增 statsmodels,覆盖"数值计算 → 数据分析 → 统计建模 → 机器学习"全链条;
- GUI 与交互环境并重:PyQt 4.9.6-1 / PySide 1.2.0 / PyQwt 5.2.1 提供原生 GUI 绑定,IPython 0.13.2 + pyzmq 13.1.0 支撑 Qt console 与 notebook,Spyder 2.2.2 作为统一入口;
- 基础设施与生态同步:pip 升到 1.4.1、setuptools 取代 distribute、winpython 工具升到 0.16,确保发行版内的包管理能力跟上当时 PyPI 生态的演进。
如需查看 2.7.5.2 的完整包清单(含工具层与全部 Python 包),可对照 changelogs/WinPython-2.7.5.2.md;若要了解现代版本(slim/dot/free 等 flavor 体系、pylock/requirements 哈希文件)下的 changelog 自动归档与命名规范,可继续阅读 tests/test_changelog_files.py 与 wppm/wppm.py。