【免费下载链接】winpython
A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python.
项目地址:
https://gitcode.com/gh_mirrors/wi/winpython
点击查看 免费下载
本文以 changelogs/WinPythonQt5-64bit-3.6.6.1_History.md 为骨架,系统梳理 WinPython-64bit 3.6.6.1Qt5 相对上一版 3.6.5.1Qt5 在软件包层面发生的全部变化(13 个新增、61 个升级、3 个移除),并结合仓库中的 wppm.diff 实现与构建脚本,讲清这类 History 文档是如何被自动生成、如何复现验证的。读完本文,你既能完整掌握该版本发行内容的增量全貌,也能直接使用 wppm 的命令行工具对任意两个版本的包索引做自定义对比。
一、一份版本 History 文档记录了什么
在 changelogs 目录下,每个 WinPython 发行版都成对存放两类 Markdown 文件:
- 包索引:如 changelogs/WinPythonQt5-64bit-3.6.6.1.md,记录该版本"最终包含"的全部工具与 Python 包清单(Tools / Python packages / WheelHouse packages 三大 section);
- 变更记录(History):如 WinPythonQt5-64bit-3.6.6.1_History.md,记录"与上一个版本相比"发生了哪些增量变化。
本文的主角 WinPythonQt5-64bit-3.6.6.1_History.md 开头即声明:The following changes were made to WinPython-64bit distribution since version 3.6.5.1Qt5.,随后按 New packages / Upgraded packages / Removed packages 三段列出全部差异。每条差异的格式固定为:
* 包名 版本号 (包的一行简介)
其中升级条目会明确写出 旧版本 → 新版本 的迁移箭头,例如:
* [numpy](http://numpy.scipy.org/) 1.14.3+mkl → 1.14.5+mkl
* [spyder](https://pypi.org/project/spyder) 3.2.8 → 3.3.0
* [Python](http://www.python.org/) 3.6.5 → 3.6.6
这份文档实际上不是人工维护的,而是构建流程在打包完成后自动产出的(详见下文第四节)。
二、本版新增的 13 个包
| appdirs | 1.4.3 | 确定平台相关目录(如 "user data dir")的小型 Python 模块 |
| hvplot | 0.2.0 | 面向 pandas、dask、streamz 与 xarray 的高层绘图 API,构建于 HoloViews 之上 |
| intake | 0.1.3 | 数据输入插件与目录(catalog)系统 |
| keras_applications | 1.0.2 | 主流深度学习模型的参考实现 |
| keras_preprocessing | 1.0.1 | 深度学习模型的数据预处理与数据增强工具 |
| keyring | 13.2.1 | 安全地存取密码 |
| msgpack_numpy | 0.4.3 | 基于 msgpack 的 NumPy 数据序列化 |
| msgpack_python | 0.5.4+dummy | MessagePack(反)序列化器 |
| parambokeh | 0.2.2 | 基于 Parameters 的声明式 Python 编程 |
| pyviz_comms | 0.1.1 | 启动任务、组织输出并剖析结果 |
| pywin32_ctypes | 0.1.2 | pywin32 的(部分)纯 Python 重实现(基于 ctypes/cffi) |
| ruamel.yaml | 0.15.42 | 支持往返保留注释、流式风格与键序的 YAML 解析/生成器 |
| spyder_kernels | 0.2.4 | 供 Spyder 控制台使用的 Jupyter 内核 |
从新增名单可以清晰看出本版的两个补强方向:
- PyViz 交互可视化家族整体入驻:hvplot、intake、parambokeh、pyviz_comms 与同步升级的 holoviews、bokeh 组成了一套"声明式绘图 + 数据目录 + 交互组件"的完整链条;
- 深度学习生态补齐:keras 2.1.6 → 2.2.0 后,其模型实现与预处理功能被拆分为独立的 keras_applications、keras_preprocessing 两个子包随发行版一并提供,配套 msgpack_numpy 便于模型/数组数据的序列化交换。
三、本版升级的 61 个包
以下为原文档完整列出的全部升级项,逐一继承如下:
| alabaster | 0.7.10 → 0.7.11 | 可配置侧边栏的 Sphinx 主题 |
| altair | 2.0.1 → 2.1.0 | 高层声明式可视化库 |
| astroid | 1.6.4 → 1.6.5 | 由 Python ast 重建抽象语法树(pylint 依赖) |
| bloscpack | 0.11.0 → 0.13.0 | Blosc 压缩的命令行接口与序列化格式 |
| bokeh | 0.12.16 → 0.13.0 | 面向统计与新型交互的 HTML 绘图 |
| cvxpy | 1.0.3 → 1.0.6 | 凸优化建模的领域专用语言 |
| dask | 0.17.5 → 0.18.1 | 极简任务调度抽象 |
| datashader | 0.6.6 → 0.6.7 | 基于网格聚合的数据可视化工具链 |
| dill | 0.2.7.1 → 0.2.8.2 | 序列化几乎所有 Python 对象 |
| distributed | 1.21.8 → 1.22.0 | 分布式计算 |
| holoviews | 1.10.5a1 → 1.11.0a1 | 可组合、声明式的数据结构,用于快速构建复杂可视化 |
| idna | 2.6 → 2.7 | 国际化域名(IDNA)支持 |
| ipyleaflet | 0.8.1 → 0.9.0 | Jupyter 动态 Leaflet 地图组件 |
| ipympl | 0.1.1 → 0.2.0 | Matplotlib 的 Jupyter 扩展 |
| ipyparallel | 6.1.1 → 6.2.2 | 基于 IPython 的交互式并行计算 |
| ipyscales | 0.1.3 → 0.2.2 | scales 组件库 |
| jedi | 0.12.0 → 0.12.1 | 文本编辑器的 Python 自动补全工具 |
| joblib | 0.11 → 0.12.0 | 轻量流水线:把 Python 函数作为流水线作业 |
| keras | 2.1.6 → 2.2.0 | 基于 Theano 的深度学习库 |
| llvmlite | 0.23.2 → 0.24.0 | 基本 LLVM 功能的轻量封装 |
| lmfit | 0.9.10 → 0.9.11 | 带边界与约束的最小二乘拟合 |
| loky | 2.1.1 → 2.1.4 | 供 joblib 使用的健壮可复用 Executor |
| lxml | 4.2.1 → 4.2.3 | 结合 libxml2/libxslt 的 Pythonic XML 处理库 |
| multiprocess | 0.70.5 → 0.70.6.1 | 更好的多进程与多线程 |
| mypy | 0.600 → 0.610 | Python 可选静态类型检查 |
| numba | 0.38.1 → 0.39.0 | 使用 LLVM 编译 Python 代码 |
| numpy | 1.14.3+mkl → 1.14.5+mkl | 多维数组处理核心(SciPy 核心模块),随附 MKL 加速 |
| octave_kernel | 0.28.3 → 0.28.4 | Octave 的 Jupyter 内核 |
| pandas | 0.23.0 → 0.23.3 | 数据分析、时间序列与统计的数据结构 |
| param | 1.6.1 → 1.7.0 | 基于 Parameters 的声明式 Python 编程 |
| parso | 0.2.1 → 0.3.0 | Python 解析器 |
| pillow | 5.1.1 → 5.2.0 | Python 图像处理库(fork) |
| psutil | 5.4.5 → 5.4.6 | 以可移植方式获取进程与系统资源信息 |
| py | 1.5.3 → 1.5.4 | 跨 Python 的 path、ini 解析、io、code、日志工具库 |
| pyct | 0.4.2 → 0.4.3 | 面向用户的 Python 包公共任务(复制示例、抓取数据等) |
| pylint | 1.9.1 → 1.9.2 | 源码静态分析,查找 bug 与低质量代码迹象 |
| pymongo | 3.6.1 → 3.7.0 | MongoDB 的 Python 驱动 |
| pyqtgraph | 0.10.1.dev2 → 0.11.0.dev0 | 科学绘图与 GUI 库 |
| pytest | 3.6.0 → 3.6.3 | 简单而强大的 Python 测试框架 |
| Python | 3.6.5 → 3.6.6 | Python 编程语言及其标准库 |
| python_snappy | 0.5.2 → 0.5.3 | Google snappy 压缩库的 Python 绑定 |
| pythreejs | 1.0.0 → 1.1.0 | Jupyter 交互式 3D 图形(基于 Three.js 与 Jupyter widgets) |
| pytz | 2018.4 → 2018.5 | 世界时区定义 |
| pywin32 | 223 → 223.1 | Python for Windows 扩展 |
| pywinpty | 0.5.3 → 0.5.4 | winpty 库的 Python 绑定 |
| pyyaml | 3.12 → 4.1 | YAML 解析与生成器 |
| regex | 2018.2.21 → 2018.6.21 | 替代 re 的增强正则模块 |
| requests | 2.18.4 → 2.19.1 | 人性化的 HTTP 客户端库 |
| rpy2 | 2.9.3 → 2.9.4 | 与 R 语言(内嵌 R)互操作 |
| simplejson | 3.14.0 → 3.16.0 | 简单、快速、可扩展的 JSON 编解码器 |
| sortedcontainers | 2.0.2 → 2.0.4 | SortedList / SortedDict / SortedSet 容器 |
| sphinx_rtd_theme | 0.3.1 → 0.4.0 | Sphinx 的 ReadTheDocs 主题 |
| sphinxcontrib_websupport | 1.0.1 → 1.1.0 | Web 应用的 Sphinx API |
| spyder | 3.2.8 → 3.3.0 | 面向交互式计算与数据可视化的科学 Python 开发环境 |
| sqlalchemy | 1.2.8 → 1.2.9 | SQL 工具包与对象关系映射器 |
| tables | 3.4.3 → 3.4.4 | 基于 HDF5 的分层数据集管理包 |
| traittypes | 0.2.0 → 0.2.1 | SciPy trait 类型 |
| urllib3 | 1.21.1 → 1.23 | 带线程安全连接池的 HTTP 库 |
| vega | 1.1.1 → 1.3.0 | Vega / Vega-Lite 的 IPython-Jupyter 组件 |
| winpython | 1.10.20180404 → 1.10.20180624 | WinPython 发行工具集,含 WPPM 包管理器 |
| xarray | 0.10.4 → 0.10.7 | N 维带标签数组与数据集 |
值得注意的升级组合:
- 科学计算基座整体推进:numpy 1.14.5+mkl、pandas 0.23.3、scipy(索引中为 1.1.0)、numba 0.39.0 构成的基础栈同步更新,保证 MKL 加速与下游生态的兼容性;
- 交互可视化主线:bokeh 0.13.0、holoviews 1.11.0a1、datashader 0.6.7、ipympl 0.2.0、ipyleaflet 0.9.0、pythreejs 1.1.0 与新增的 PyViz 家族呼应;
- IDE 架构升级:spyder 3.3.0 配合新增的 spyder_kernels 0.2.4(供 Spyder 控制台使用的 Jupyter 内核),印证了 Spyder 向"客户端 + Jupyter 内核"架构迁移的路线;
- 发行工具自举更新:winpython 工具包自身从 1.10.20180404 升级到 1.10.20180624,说明 History 文档所依赖的 WPPM 基础设施也在随版本演进。
四、本版移除的 3 个包
| blaze | 0.10.1 | Blaze 数据处理框架 |
| flask_cors | 3.0.4 | 为 Flask 增加 CORS 支持的装饰器扩展 |
| odo | 0.5.0 | Python 数据迁移工具 |
可以推断,blaze 与 odo 的移除与其周边生态的此消彼长直接相关:blaze/odo 所承担的"异构数据迁移"职责,在本版中已逐步由 dask、pandas、pyarrow 等更主流的数据栈替代;而 flask_cors 作为 blaze 生态的辅助依赖也随之退出发行版。移除 3 个包的同时新增/升级大量包,也体现了 WinPython 每个周期"去旧迎新"的发行策略。
五、源码级原理:History 文档是如何自动生成的
这类 _History.md 不是手写的,而是由 wppm/diff.py 在构建阶段自动 diff 出来的。其核心链路分四步:
1. 包行的结构化解析(Package 类)
wppm/diff.py 用两条正则分别匹配 SourceForge 与 Google Code 两种历史行格式:
r"\\[([\\w\\-\\:\\/\\.\\_]+)\\]\\(([^)]+)\\) \\| ([^\\|]*) \\| ([^\\|]*)" # SourceForge
r"\\[([\\w\\-\\:\\/\\.\\_]+) ([^\\]\\ ]+)\\] \\| ([^\\|]*) \\| ([^\\|]*)" # Google Code
匹配成功后拆出 name / url / version / description 四个字段;无法识别的行抛出 Unrecognized package line format 异常,被上层静默跳过。
2. 索引文档的分节读取(PackageIndex 类)
wppm/diff.py 只关心三个 section 头:### Tools、### Python packages、### WheelHouse packages,并跳过表头行(Name | Version | Description、—–|———|————)与空行,最终得到 {"tools": {…}, "python": {…}, "wheelhouse": {…}} 三份以"规范化包名 → Package 对象"为键值的字典。
3. 三段式差异生成(compare_packages)
wppm/diff.py 对旧、新两份索引做集合运算,一次产出本文读到的三大部分:
- added:新索引有、旧索引没有 → 归入 New packages;
- upgraded:两边都有但版本号不同 → 归入 Upgraded packages,且强制按 旧版本 → 新版本 书写箭头;
- removed:旧索引有、新索引没有 → 归入 Removed packages。
若没有任何差异,则输出 No differences found.。
4. 版本定位与标题生成(compare_package_indexes)
wppm/diff.py 负责拼装最终文档:先用 wppm/diff.py 的 changelog_versions 扫描 changelogs 目录,按 WinPython{flavor}-{architecture}bit-{version}.md 命名模式收集全部版本,再用 packaging.version.parse 做 PEP 440 语义比较,找出"严格早于目标版本"的最大版本作为对比基准,最终生成与本文开头完全一致的标题:
## History of changes for WinPython-64bit 3.6.6.1Qt5
5. 与构建流程的集成
在 winpython/build_winpython.py 的 Step 7 中,构建脚本先调用 wppm.Distribution().generate_package_index_markdown()(见 wppm/wppm.py)生成包索引 WinPythonQt5-64bit-3.6.6.1.md 并拷贝进 changelogs 目录,随后调用 diff.compare_package_indexes(…) 生成对应的 _History.md,放在构建输出目录旁供发布者预览。其中 –release-level 会拼入版本名(如 3.6.6.1b1),保证 beta 与正式版各占一份独立文件、互不覆盖。
六、自己动手:用 wppm.diff 复现与自定义对比
即使不重新构建发行版,你也可以用 wppm 提供的命令行工具,对任意两份包索引或任意两个版本号做对比。wppm/diff.py 中内置的用法说明如下:
# 1. 对比两个包索引文件的所有 section(方向无所谓,升级箭头自动为"旧 → 新")
wppm -diff file1.md file2.md
python -m wppm.diff file1.md file2.md
# 2. 只对比指定 section,如只对比 Python 包
python -m wppm.diff file1.md file2.md –section python python
# 3. 对比指定 section 对,如 python↔wheelhouse、tools↔tools
python -m wppm.diff file1.md file2.md –pairs python wheelhouse tools tools
# 4. 按版本号对比(自动从 changelogs 目录读取索引并找到上一版本)
python -m wppm.diff <version2> <version1> [searchdir] [flavor] [architecture]
# 5. 把对比结果写入文件(可选拷贝到 basedir)
python -m wppm.diff –write-changelog <version2> <version1> [searchdir] [flavor] [architecture] [basedir]
针对本文的 Qt5 版本,可以这样复现:
python -m wppm.diff 3.6.6.1 3.6.5.1 changelogs Qt5 64
其中 Qt5 是 flavor 参数,64 是架构参数——它正好匹配 changelogs/WinPythonQt5-64bit-3.6.5.1.md 与 changelogs/WinPythonQt5-64bit-3.6.6.1.md 两份索引的文件名模式。由于升级箭头使用的是 → 字符而 Windows 控制台默认 cp1252 编码,wppm/diff.py 在入口处会对 stdout 做 UTF-8 重配置(errors="replace"),避免"对比两个版本"直接变成编码异常。
七、Qt5 风味的落地:PyQt5 在发行版中的特殊处理
"Qt5" 在 WinPython 版本命名中代表一个风味(flavor)。当前仓库的构建系统以 winpython_builds.toml 中的 [flavors.*] 块定义风味(例如 dot、slim 各自指定 requirements 文件、source_dirs 与 toolsdirs),Qt5 属于历史风味命名,标识该发行版以 PyQt5 作为 Qt 绑定。
在 wppm/wppm.py 的 handle_specific_packages 中,对 pyqt4 / pyqt5 / pyside2 有专门的落地处理:
- 在包目录与发行版根目录各写入一份 qt.conf,内容为 [Paths] Prefix = . 与 Binaries = .,让 Qt 运行时能按相对路径找到自身资源(保证绿色便携性);
- 为 PyQt5 生成 pyuic5.bat 启动脚本,内部先 call "%~dp0..\\..\\scripts\\env.bat" 再执行 python.exe -m PyQt5.uic.pyuic,使 .ui 转 .py 工具可在未注册环境的机器上直接使用;
- 补齐 uic 子目录(Loader、port_v2、port_v3)缺失的 __init__.py,修复导入问题。
这也是理解 3.6.6.1Qt5 索引中 PyQt5 5.9.2、qtpy 1.4.2、qtawesome 0.5.0.dev0、pyqtgraph 0.11.0.dev0 等 Qt 生态包为何能以"免安装、可整体搬移"方式运行的关键。
八、小结
WinPythonQt5-64bit-3.6.6.1_History.md 不仅仅是一份供人阅读的发布说明,它同时是 WinPython 自动化构建体系的一个可验证产物:新增 13 包、升级 61 包、移除 3 包的全部增量,都由 wppm/diff.py 从相邻版本的包索引中机械生成。透过这份文档,你可以同时掌握三层信息:
赞
【免费下载链接】winpython
A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python.
项目地址:
https://gitcode.com/gh_mirrors/wi/winpython
点击查看 免费下载
相关推荐
AMD Ryzen调试工具SMUDebugTool:免费开源硬件调校终极指南
如何快速掌握AMD性能调优:SMUDebugTool终极配置指南
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



