WinPython-64bit 3.11.3.0 版本历史全解读:包更新清单、变更脉络与 changelog 生成机制
WinPython-64bit 3.11.3.0 版本历史全解读:包更新清单、变更脉络与 changelog 生成机制
WinPython-64bit 3.11.3.0 是该发行版在 Python 3.11 主线上的一个重要迭代,从 3.11.0.1 升级而来。本文以仓库中的 WinPython-64bit-3.11.3.0_History.md 为主体,完整梳理本次发行新增、升级与移除的软件包,并结合 wppm/diff.py、winpython/build_winpython.py 等源码,讲清楚这类 History 文档是如何自动生成的、它的格式约定是什么,以及普通用户如何用 wppm -diff 自行对比任意两个版本的包清单。读完本文,你既能快速了解 3.11.3.0 相比 3.11.0.1 到底"变了什么",也能掌握 WinPython changelog 体系的读写与复用方法。
一、这份文档是什么:History 文档在 changelog 体系中的位置
在仓库的 changelogs 目录中,每一个 WinPython 版本都有两类文档:
- 包索引(Package Index):如 WinPython-64bit-3.11.3.0.md,以 Markdown 表格形式列出该版本发行包内的全部工具与 Python 包及其版本、描述,是"某版本装了什么"的完整快照。
- 版本历史(History):如本文主体 WinPython-64bit-3.11.3.0_History.md,记录的是"自上一个版本以来发生了什么",即对前后两个包索引做差异对比后的结果,按 New packages(新增)、Upgraded packages(升级)、Removed packages(移除) 三类罗列。
从 wppm/diff.py 的实现可以确认:compare_packages() 先把两个索引中的包名统一为小写并以下划线替换连字符(k.replace("-", "_").lower()),再分别求出:
added:新索引中有而旧索引中没有的包;upgraded:两索引都有但版本号不同的包,输出格式固定为旧版本 → 新版本;removed:旧索引中有而新索引中没有的包。
本份 3.11.3.0 History 文档的基准版本正是 3.11.0.1,标题行 "The following changes were made to WinPython-64bit distribution since version 3.11.0.1" 由 wppm/diff.py 的 compare_package_indexes() 自动生成,其比较方向是"旧 → 新",升级行一律写成 旧 → 新 形式,避免读者将比较方向弄反时把升级误读为降级。
1.1 History 文档与索引文档的命名约定
- 索引文档命名:
WinPython{flavor}-{arch}bit-{version}.md,如WinPython-64bit-3.11.3.0.md(无 flavor 时即标准发行版); - History 文档命名:
WinPython{flavor}-{arch}bit-{version}_History.md,如WinPython-64bit-3.11.3.0_History.md。
winpython/build_winpython.py 中通过 mdn 与 out 两个变量分别构造这两类文件名。命名规则在测试 tests/test_changelog_files.py 中被固定下来:解析器只接受真正的包索引名,_History.md 等伴随文件会被明确拒绝——History 不是一份独立索引,它只是"前后两个索引的差异视图"。
1.2 为什么 History 文档不进入正式发布归档
仓库测试 tests/test_changelog_files.py 的模块注释与 winpython/build_winpython.py 的注释给出了明确的设计取舍:History 是写给正在构建发行版的人看的(发布前检查本次构建相比上一次移动了哪些包),因此它只生成在构建输出目录旁,不会被复制进 changelogs/ 归档。原因在于:
flavors(如 slim、dot)在不同发布周期之间时有时无,且普通用户大约一年才升级一次,与"紧邻上一版本"的对比对读者没有持续价值。读者真正需要的是"自己任选两个版本/两个 flavor 进行对比",这由
wppm -diff提供。
这与本文档实际所在位置并不矛盾——当前仓库是开发与构建工具链仓库,保留了较早期周期的历史文档;而这一生成逻辑正是理解本份 History 文档由来的关键。
二、3.11.3.0 相比 3.11.0.1 的完整变更清单
本节完整继承 History 文档的全部条目,并适当归类说明,便于快速检索。
2.1 工具(Tools)升级
本次发行随附的外部工具做了两个升级,均服务于 JavaScript/前端生态:
| 工具 | 原版本 | 新版本 | 说明 |
|---|---|---|---|
| Nodejs | v16.16.0 | v18.16.0 | 基于 Chrome V8 引擎的 JavaScript 运行时 |
| npmjs | 8.11.0 | 9.5.1 | JavaScript 包管理器 |
Node.js 从 16 LTS 线跨入 18 线,npm 同步跟进到 9.x,意味着 JupyterLab 前端扩展、jupyterlab-risize 幻灯片、基于 Node 的构建工具等都会在新版本环境中运行。
2.2 新增的 Python 包(New packages)
3.11.3.0 一次性引入了 100+ 个新包,覆盖深度学习、贝叶斯统计、凸优化、地理可视化、NLP、Jupyter 协作等多个方向。以下按技术领域分组列出(包名与版本号均来自 History 文档,括号内为官方描述摘要):
深度学习与 PyTorch 生态
- accelerate 0.19.0(Accelerate,Hugging Face 的训练加速库)
- botorch 0.8.5(基于 PyTorch 的贝叶斯优化)
- gpytorch 1.10(PyTorch 中的高斯过程实现)
- linear_operator 0.4.0(有限维正定算子线性代数实现,gpytorch 的底层依赖)
- torch 2.0.1(张量与动态神经网络,GPU 加速)
- torchaudio 2.0.2(PyTorch 音频处理包)
- torchvision 0.15.2(图像/视频数据集与模型)
- fastai 2.7.12(让 PyTorch 深度学习更快、更准、更简单)
- fastcore 1.5.11、fastdownload 0.0.7、fastprogress 1.0.3(fastai 生态组件)
- transformers 4.29.1(面向 JAX/PyTorch/TensorFlow 的 SOTA 机器学习库)
- tokenizers 0.13.3(快速可定制的分词器)
- huggingface_hub 0.14.1(HF Hub 的下载/发布客户端)
- openai 0.27.5(OpenAI API 的 Python 客户端)
- opt_einsum 3.3.0(优化 numpy 的 einsum 函数)
- numba 0.57.0(基于 LLVM 编译 Python 代码)与 llvmlite 0.40.0
贝叶斯统计与 MCMC
- arviz 0.15.1(贝叶斯模型探索性分析)
- pymc 5.3.0(马尔可夫链蒙特卡洛采样工具箱)
- pytensor 2.11.2(数学表达式的 CPU/GPU 优化编译器,PyMC 的符号计算后端)
- pyro_api 0.1.2、pyro_ppl 1.8.4(Pyro 概率编程库)
- xarray_einstats 0.5.1(xarray 上的统计/线性代数/einops)
凸优化与数值求解
- cvxopt 1.3.0(凸优化包)
- cvxpy 1.3.1(凸优化问题的领域特定语言)
- ecos 2.0.12(嵌入式锥求解器)
- osqp 0.6.2.post9(算子分裂 QP 求解器)
- qdldl 0.1.7(LDL 分解例程)
- quadprog 0.1.11(二次规划求解器)
- scs 3.2.3(分裂锥求解器)
- qpsolvers 3.1.0(统一 API 的二次规划求解器集合)
地理空间与可视化
- cartopy 0.21.1(带 Matplotlib 支持的地图绘制库)
- geoviews 1.10.0a2.post4+g65df916(地理/气象/海洋数据集可视化)
- pyshp 2.3.0(ESRI Shapefile 纯 Python 读写)
- datashader 0.14.5a1+g7a97e97.dirty(基于网格聚合的数据可视化工具链)
- datashape 0.5.2(数据描述语言)
- spatialpandas 0.4.7(空间/几何操作的 pandas 扩展数组)
- umap_learn 0.5.1(UMAP 降维)、pynndescent 0.5.7(最近邻下降)
NLP 与 spaCy 生态
- spacy 3.5.2(工业级 NLP 库)及其配套 spacy_legacy 3.0.12、spacy_loggers 1.0.3、thinc 8.1.9、blis 0.7.9、catalogue 2.0.8、confection 0.0.3、cymem 2.0.7、preshed 3.0.8、murmurhash 1.0.9、srsly 2.4.5、wasabi 0.10.1、smart_open 5.2.1、langcodes 3.3.0、pathy 0.10.1
分布式计算与数据
- dask_ml 2023.3.24(分布式/并行机器学习)、dask_glm 0.2.0(Dask 广义线性模型)
- pyarrow 12.0.0(Apache Arrow 的 Python 库)
- feather_format 0.4.1(基于 Arrow 的 Feather 文件格式封装)
- h5netcdf 1.1.0(通过 h5py 读写 netCDF4)
- smart_open 5.2.1(流式读取 S3/HDFS/GCS/Azure Blob 等大文件)
Jupyter 生态(含协作编辑与幻灯片)
- comm 0.1.3(Jupyter 的 Comm 实现)、ipydatagrid 1.1.15(Notebook/JupyterLab 快速数据表格)
- jupyter_events 0.6.3、jupyter_server_fileid 0.9.0、jupyter_server_terminals 0.4.4
- jupyter_ydoc 0.2.4、jupyter_server_ydoc 0.8.0、y_py 0.5.5、ypy_websocket 0.8.2(基于 Y-CRDT 的 Jupyter 实时协作编辑栈)
- jupyterlab_rise 0.2.0(Reveal.js 幻灯片扩展)、sphinxcontrib_jquery 4.1
Web / API / 认证 / 数据访问
- streamlit 1.22.0(最快构建数据应用的方式)
- azure_core 1.25.1、azure_cosmos 4.3.1、azure_identity 1.12.0(Azure 全家桶)
- msal 1.22.0、msal_extensions 1.0.0(微软认证库)
- pyjwt 2.4.0(JSON Web Token 实现)
- dnspython 2.1.0(DNS 工具包)
- pymongo 4.3.3(MongoDB 驱动)、pyodbc 4.0.35(ODBC 的 DB-API 模块)
- python_json_logger 2.0.4、validators 0.18.2、typer 0.7.0
Markdown / 文档工具链
- markdown_it_py 2.2.0、mdit_py_plugins 0.3.5、mdurl 0.1.2、linkify_it_py 2.0.0、uc_micro_py 1.0.1(markdown-it 生态)
- docstring_to_markdown 0.10、py2vega 0.6.1
- build 0.10.0、pyproject_hooks 1.0.0、maturin 0.14.15(Python 打包与 Rust 绑定构建)
其他实用工具
- cachetools 5.2.0(可扩展的记忆化集合/装饰器)
- gmpy2 2.1.5(GMP/MPIR/MPFR/MPC 接口)
- guiqwt 4.3.3(曲线与图像绘制的工具集)
- quantecon 0.5.3(数量经济学建模)
- astroml 1.0.2.post1(天文学机器学习/数据挖掘)
- sklearn_contrib_lightning 0.6.2.post0(大规模稀疏线性分类/回归/排序)、pygbm 0.1.0(基于 numba 的 GBM)、dirty_cat 0.4.1(脏类别机器学习)
- multipledispatch 0.6.0、etuples 0.3.8、logical_unification 0.4.5、minikanren 1.0.3、cons 0.4.5(关系/函数式编程工具)
- asttokens 2.1.0、executing 1.2.0、pure_eval 0.2.2、stack_data 0.6.1(AST/栈帧分析,IPython 调试生态依赖)
- more_itertools 9.0.0、jaraco.classes 3.2.3、portalocker 2.7.0、retrying 1.3.4、pympler 1.0.1、pyzstd 0.15.4
- 格式/校验类:fqdn 1.5.1、isoduration 20.11.0、rfc3339_validator 0.1.4、rfc3986_validator 0.1.1、uri_template 1.2.0、webcolors 1.12
- 其他:lazy_loader 0.2、gast 0.4.0、pylint_venv 2.3.0
2.3 升级的 Python 包(Upgraded packages,节选核心)
History 文档共记录约 90 个升级包,这里列出对科学计算与开发体验影响最大的部分,完整列表见原文档:
| 包 | 原版本 | 新版本 |
|---|---|---|
| Python | 3.11.0 | 3.11.3(CPython 3.11 补丁版) |
| numpy | 1.23.4 | 1.24.2 |
| pandas | 1.5.1 | 1.5.2 |
| scipy | 1.9.3 | 1.10.1 |
| matplotlib | 3.6.0 | 3.7.1 |
| scikit_learn | 1.1.3 | 1.2.2 |
| scikit_image | 0.19.3 | 0.20.0 |
| seaborn | 0.12.1 | 0.13.0.dev0 |
| statsmodels | 0.13.2 | 0.14.0 |
| sympy | 1.11.1 | 1.12 |
| dask | 2022.10.1 | 2023.5.0 |
| distributed | 2022.10.1 | 2023.5.0 |
| bokeh | 2.4.3 | 3.1.1(跨大版本) |
| dash | 2.6.2 | 2.8.1 |
| panel | 0.14.1 | 1.0.2(跨大版本) |
| plotly | 5.11.0 | 5.13.1 |
| polars | 0.14.22 | 0.17.11 |
| duckdb | 0.5.2.dev1339 | 0.8.0 |
| geopandas | 0.12.1 | 0.13.0 |
| shapely | 1.8.5.post1 | 2.0.1(跨大版本) |
| xarray | 2022.10.0 | 2023.4.2 |
| fastapi | 0.85.1 | 0.95.1 |
| starlette | 0.20.4 | 0.26.1 |
| uvicorn | 0.19.0 | 0.20.0 |
| networkx | 2.8.7 | 3.1(跨大版本) |
| pyarrow | — | 12.0.0(新增见上) |
| ipython | 7.32.0 | 8.13.1(跨大版本) |
| jupyterlab | 3.5.0 | 3.6.3 |
| jupyter_server | 1.21.0 | 2.5.0(跨大版本) |
| jupyter_client | 7.3.4 | 8.2.0(跨大版本) |
| jupyter_core | 4.11.2 | 5.3.0(跨大版本) |
| ipykernel | 6.16.2 | 6.22.0 |
| spyder | 5.3.3 | 5.4.3 |
| spyder_kernels | 2.3.3 | 2.4.3 |
| pyzo | 4.12.4.dev0 | 4.12.7 |
| black | 22.10.0 | 23.3.0 |
| mypy | 0.982 | 1.3.0 |
| pytest | 7.1.1 | 7.2.1 |
| pip | 22.3 | 23.1.2 |
| setuptools | 65.5.0 | 67.7.2 |
| pywin32 | 304.0 | 305 |
| pythonnet | 3.0.0rc1 | 3.0.1 |
| python_lsp_server | 1.5.0 | 1.7.2 |
| cryptography | 3.4.7 | 37.0.4 |
| sqlalchemy | 1.4.42 | 1.4.47 |
| sphinx | 5.3.0 | 6.1.3 |
| winpython | 5.1.20221030 | 6.1.20230518(WinPython 发行工具本身,含 WPPM) |
2.4 移除的 Python 包(Removed packages)
本次发行移除了 15 个包,其中多数是因为功能被替代或上游停止维护:
- altair_widgets 0.2.2(Altair 交互式可视化组件)
- dask_labextension 5.3.0(Jupyter 扩展中管理 Dask 集群,已被 JupyterLab 原生集成取代)
- flask_compress 1.13(Flask gzip 压缩)
- great_expectations 0.14.11(数据质量期望框架)
- jsonpatch 1.32(RFC 6902 JSON 补丁)
- jupyter_lsp 1.5.1、jupyterlab_lsp 3.10.2(LSP 集成)
- jupyter_server_proxy 3.2.1、simpervisor 0.4(Jupyter 服务代理及配套进程监督器)
- palettable 3.3.0(配色板)
- pdvega 0.2.1.dev0(pandas → Vega 绘图接口,长期未维护)
- py 1.11.0(跨版本工具库,pytest 7.2 起已不再依赖)
- rise 5.7.1(Reveal.js 幻灯片扩展,被新增的 jupyterlab_rise 取代)
- tomli 2.0.1(TOML 解析器,Python 3.11 标准库已内置 tomllib)
- vega 3.6.0(Vega widget)
三、这份 History 是如何生成的:源码级拆解
理解了清单内容之后,值得看看它背后的生成链路,这也是 WinPython 构建工具链中"生成 changelog"的标准步骤。
3.1 构建流水线中的 Step 7
在 winpython/build_winpython.py 中,"generate changelog" 是构建流水线的第 7 步,分两个子步骤:
- 生成包索引:调用
wppm.Distribution().generate_package_index_markdown(),把当前构建产物的完整包清单写成WinPython{flavor}-{arch}bit-{version}.md,并复制进 changelogs 目录; - 生成 History:调用
wppm.diff.compare_package_indexes(version, searchdir=changelog_dir, flavor=..., architecture=...),自动从changelogs/中找到紧邻的上一个版本索引,做差异对比后写出_History.md,但保留在构建输出目录旁,不进归档。
注意第 316 行的注释:changelog_version = f"{winpyver2}{args.release_level}"——发布级别(如 b1)必须写进文件名,否则一个 beta 与它转正后的正式版共享同一个 winpyver2,beta 的包清单会覆盖正式版的索引文件。
3.2 "上一个版本"如何确定
winpython/build_winpython.py 委托 wppm/diff.py 的 find_previous_version():它遍历 changelogs/ 中所有 WinPython{flavor}-{arch}bit-{version}.{txt|md} 文件,用 PEP 440 版本解析器对文件名中的版本号排序,选出"小于目标版本的最大版本"。
由 tests/test_diff_versions.py 可见该逻辑已被测试严格约束:
- 带发布级别的版本(如
3.14.7.1b1)会被正确识别并参与排序(b1 位于 .0 与 .1 之间); _History.md伴随文件永远不会被选为"上一版本";- 不同 flavor 之间互不干扰(dot 不对比 slim),且
dot不会错误匹配dotf; - 没有更早版本时,回退为"与自身对比",得到空差异。
3.3 差异文档的格式约定
compare_package_indexes() 拼装出的最终文档就是本文档的模板:
## History of changes for WinPython-{arch}bit {version}{flavor}
The following changes were made to WinPython-{arch}bit distribution since version {prev}{flavor}.
### Tools / ### Python packages
New packages: ...
Upgraded packages: ... (旧版本 → 新版本)
Removed packages: ...
其中 Tools 与 Python packages 两个区块分别调用 compare_markdown_sections() 完成对比,升级行的箭头方向恒为"旧 → 新"。
四、读者视角:如何用 wppm -diff 做任意版本对比
既然 History 文档不再随发布归档,那么普通用户如何比较两个版本的差异?答案是 WPPM 自带的 -diff 命令。相关入口在 wppm/wppm.py:
python -m wppm -diff WinPythonslim-64bit-3.13.5.0.md WinPythonslim-64bit-3.14.7.0.md
该命令接受任意两个索引文档(不要求相邻版本、不要求同一 flavor),比较方向由参数顺序决定,内部调用 compare_files(),支持三种模式:
| 模式 | 说明 |
|---|---|
full |
对比 Tools、Python packages、WheelHouse packages 全部区块 |
section |
只对比指定的某一区块(header1/header2 指定) |
pairs |
按给定的区块对逐一对比 |
文件读取时使用 utils.guess_encoding() 自动探测编码,兼容仓库内新旧 changelog(早期 .txt 与后期 .md 并存)。你可以用它验证本文档内容,例如:
python -m wppm -diff changelogs/WinPython-64bit-3.11.0.1.md changelogs/WinPython-64bit-3.11.3.0.md
输出将复现本 History 文档中的 New / Upgraded / Removed 三类清单。
五、3.11.3.0 版本的技术要点与升级建议
综合上面的清单,可以从几个维度总结本次版本的特点:
- Python 3.11.3 补丁基线:CPython 自 3.11.0 升级到 3.11.3,属于 3.11 稳定线上的安全与缺陷修复版本;同时
tomli被移除正是利用了 3.11 标准库内置tomllib的事实(构建脚本 build_winpython_meta.py 也注明"stdlib since 3.11")。 - 深度学习栈的一次性补强:PyTorch 2.0.1 全家桶(torch/torchvision/torchaudio)、transformers、accelerate、fastai、numba + llvmlite 同时就位,3.11.3.0 开箱即可跑主流深度学习训练与推理流程。
- Jupyter 生态向协作与新一代协议演进:jupyter_server 2.x、jupyter_client 8.x、jupyter_core 5.x 集体跨大版本;新增基于 Y-CRDT 的 ydoc/ypy 协作栈;用 jupyterlab_rise 取代 rise 承担幻灯片功能。
- 可视化与地理空间能力增强:bokeh 3.x、panel 1.x 跨大版本升级,cartopy、geoviews、datashader、spatialpandas、pyproj、shapely 2.0 补齐了地理数据从读取到渲染的整条链路。
- 优化与贝叶斯计算完整覆盖:cvxpy + 多求解器(ecos/osqp/scs/qdldl/quadprog)、pymc + pytensor、pyro、arviz 构成从凸优化到贝叶斯推断的完整工具链。
升级建议:如果你正在使用 3.11.0.1 及更早版本,升级到 3.11.3.0 可获得以上全部新增与修复;如果不需要 bokeh 3.x / panel 1.x / shapely 2.0 等跨大版本带来的 API 变化,可先查阅对应包的迁移说明再升级。
六、延伸阅读
- 本版本的完整包索引(含全部包的版本与描述):WinPython-64bit-3.11.3.0.md
- History 生成与对比实现:wppm/diff.py
- 构建流水线中生成 changelog 的 Step 7:winpython/build_winpython.py
- changelog 文件选择与命名的测试约束:tests/test_changelog_files.py
- 版本回退选择逻辑的测试:tests/test_diff_versions.py
- WPPM 命令行入口(
-diff参数):wppm/wppm.py - WinPython 构建工具链与 WPPM 的整体说明:README.rst