多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

CPython 3.5.0rc4 发布说明解读:strptime 测试修复与 Windows 构建运行时调整

CPython 3.5.0rc4 发布说明解读:strptime 测试修复与 Windows 构建运行时调整 编程语言语言运行时解释器标准库【免费下载链接】cpythonThe Python programming language项目地址https://gitcode.com/GitHub_Trending/cp/cpython点击查看免费下载CPython 每次发布版本都会在仓库中沉淀一份规范的变更记录news entry本文基于 Misc/NEWS.d/3.5.0rc4.rst 这份真实历史文档剖析 CPython 3.5.0rc42015-09-09 发布的两条关键变更修复test_strptime中出现的MemoryError以及回退部分静态构建选项并为 Windows 安装包补充vcruntime140.dll。读完本文你将理解 CPython 新闻条目的元数据格式、strptime的底层实现与测试体系以及 Windows 下 Python 与 MSVC C 运行时的依赖关系。一、先读懂这份文档CPython 的 blurb 新闻条目格式Misc/NEWS.d/3.5.0rc4.rst是 CPython 专门存放按版本组织的发布变更的目录。当前仓库中Misc/NEWS.d/下共有 119 个文件覆盖 3.10.0a1 至 3.14 的各 alpha/beta/rc 版本如 Misc/NEWS.d/3.13.0a1.rst更早的历史则归档在 Misc/HISTORY 中。这份文件采用 CPython 新闻工具链blurb的标准条目格式每个条目由一组 RST 注释元数据加一行正文组成.. bpo: 25029 # 关联的 Python bug 跟踪单号 .. date: 9304 # 条目的排序序号越大越新 .. nonce: Zf97rk # 防止哈希冲突的随机串用于唯一标识条目 .. release date: 2015-09-09 # 该版本的实际发布日期 .. section: Library # 变更所属的分类如 Library / Build / Core and Builtins Fixes MemoryError in test_strptime.其中.. section:的取值决定了这条新闻在最终发布说明中的归类。对当前仓库全部Misc/NEWS.d条目做统计可以看到主要的分类及其体量Library7916 条、Core and Builtins3444 条、Build752 条、C API695 条、Tests694 条、IDLE527 条、Windows515 条、Documentation511 条、Security218 条、Tools/Demos190 条、macOS133 条。本文涉及的两条恰好分属Library库层修复与Build构建系统变更两个典型分类。3.5.0rc4属于 3.5.0 正式版之前的第四个发布候选版本.. release date: 2015-09-09明确标注了其发布时间。整个文件仅两条新闻正是 rc候选发布阶段只做修复、不再引入新功能的典型形态。二、bpo-25029修复 test_strptime 中的 MemoryError2.1 变更内容第一条新闻section: Library正文只有一句话Fixes MemoryError in test_strptime.即修复了test_strptime测试在执行过程中可能抛出的MemoryError内存分配失败错误。这类修复通常意味着在某个运行环境下测试代码或被测代码存在导致异常内存占用/分配失败的问题通过本次改动使该测试在各种环境下都能稳定通过。2.2 strptime 的底层实现当前仓库可对照的源码strptime是 Python 中把字符串按格式指令解析为时间元组的函数与strftime格式化输出互为逆操作。其纯 Python 实现位于 Lib/_strptime.py模块头部注释清晰说明了内部结构LocaleTime发现并存储与区域设置locale相关的时间信息星期名、月份名、AM/PM 表示等TimeRE把格式字符串编译为正则表达式用于对输入文本做模式匹配_getlang()探测当前LC_TIME区域设置见 Lib/_strptime.py_strptime()核心入口计算输入字符串所表示的时间结构体见 Lib/_strptime.py。特别值得注意的是_strptime()中的缓存机制见 Lib/_strptime.py模块维护了全局的_TimeRE_cache区域时间信息缓存与_regex_cache已编译正则缓存上限_CACHE_MAX_SIZE 5并用_cache_lock保证多线程安全。当_getlang()、time.tzname或time.daylight发生变化时缓存会被整体重建。从源码结构看strptime的正确性与性能高度依赖区域信息探测—正则编译—缓存这条链路测试中的内存问题也往往与这类编译/缓存路径上的资源消耗相关。2.3 测试体系test_strptime.py 在验证什么与_strptime.py对应的是体量达 961 行的 Lib/test/test_strptime.py它覆盖了getlang_Tests验证_getlang()与locale.getlocale(locale.LC_TIME)一致LocaleTime_Tests把strftime的%A/%a/%B/%b/%p等输出与LocaleTime存储的元组逐一对照校验星期名、月份名的内容与位置strptime_Tests等对%Y、%U/%W周数、儒略日换算等指令做正向与负向断言。测试文件还导入了test.support中的skip_if_buggy_ucrt_strfptime装饰器见 Lib/test/test_strptime.py用于在 MSVC UCRT 存在已知strptime/strftime缺陷的 Windows 环境下跳过部分用例——该装饰器在 Lib/test/support/init.py 中实现当平台为 win32、locale 编码为cp65001且time.localtime().tm_zone为空字符串时判定 UCRT 存在缺陷并跳过测试。这反映出strptime家族测试对平台 区域 C 运行时组合的高度敏感也正是 bpo-25029 这类测试中偶发 MemoryError需要专门修复的原因。三、bpo-25027回退部分静态构建选项Windows 安装包加入 vcruntime140.dll3.1 变更内容第二条新闻section: Build正文Reverts partial-static build options and adds vcruntime140.dll to Windows installation.包含两层含义回退部分静态构建选项reverts partial-static build options构建系统在 rc 阶段收回了此前引入的部分静态构建相关改动避免其对发布构建造成不确定影响在 Windows 安装中补充vcruntime140.dll把 MSVC 的 C 运行时 DLL 随 Python 一并分发保证python.exe在未预装该运行时的目标机器上也能直接运行。3.2 静态/共享构建选项在源码中的痕迹部分静态partial static指构建产物中一部分库采用静态链接、一部分采用共享链接的混合形态。当前仓库 configure.ac 中仍完整保留着这一维度的配置能力可以佐证构建系统长期维护的相关选项--enable-shared是否构建共享的 Python 库默认否见 configure.ac--with-static-libpython/--without-static-libpython是否生成静态libpython见 configure.ac--enable-static-libpython-for-interpreter是否为解释器单独启用静态libpython见 configure.ac 附近。从源码结构看这些选项的组合即构成全静态/全共享/部分静态等不同构建形态3.5.0rc4 对该方向的选项做回退说明当时存在与发布构建不兼容的风险点属于发布前的保守收敛。3.3 vcruntime140.dllPython 与 MSVC C 运行时的关系Windows 上的 CPython 由 MSVCVisual C编译运行时依赖对应的 C 运行时库。vcruntime140.dll对应 Visual Studio 2017 使用的 C 运行时版本 14.0。PCbuild/readme.txt 明确指出Visual Studio 2017 uses version 14.0 of the C runtime (vcruntime140). The executables no longer use the Side by Side assemblies used in previous versions of the compiler. This simplifies distribution of applications.即从 VS2017 起可执行文件不再依赖并行程序集Side by Side机制运行时库可以直接以 DLL 形式随应用分发这使把vcruntime140.dll放进安装包成为简化部署的可行方案。当前仓库的工程文件 PCbuild/pythoncore.vcxproj 中保留了_CopyVCRuntimetargetAfterTargetsBuild在构建完成后把VCRuntimeDLL复制到输出目录并附带一条注释对应 bpo-38597When we switch to another VCRuntime DLL, include vcruntime140.dll as well——即无论切换到哪个版本的 VC 运行时vcruntime140.dll都需要一并提供。这印证了该 DLL 对 Python 运行时的基础性地位。在安装包/目录布局层面PC/layout/main.py 会在布局过程中从构建目录递归查找vcruntime*.dll并复制进输出目录找不到则报错PC/layout/support/python.props 也把$(PythonHome)\vcruntime140.dll显式列入运行时文件清单PC/layout/README.md 同样说明布局打包时通过vcruntime*通配规则收集该 DLL。由此可见安装中包含vcruntime140.dll已经固化为当前构建与打包流程的标准行为。3.4 实际操作如何在 Windows 上构建并验证若要复现相关构建行为可参考当前仓库 PCbuild/build.bat 提供的命令行入口其-h帮助文本列出了全部参数。典型用法PCbuild\build.bat :: 默认 Release / x64 配置构建 PCbuild\build.bat -d -p Win32 :: Debug 32 位平台 PCbuild\build.bat --pgo :: 启用 Profile-Guided Optimization构建完成后pythoncore.vcxproj的_CopyVCRuntimetarget 会把运行时 DLL 复制到$(OutDir)如PCbuild\win32或PCbuild\amd64随后用PCbuild\rt.bat即可运行刚构建的python.exe做冒烟验证。安装包布局则由PC/layout/下的工具完成其rglob(ns.build, vcruntime*.dll)逻辑PC/layout/main.py保证了安装目录中一定包含运行时。四、历史档案价值如何继续追查这两条变更Misc/NEWS.d/3.5.0rc4.rst这类文件本身即 CPython 的历史档案。若想进一步追查 bpo-25029 与 bpo-25027 的来龙去脉仓库内还有两条线索SVN 提交映射表Misc/svnmap.txt 中记录了 bpo 25027 与 25029 对应的提交哈希可据此回溯当时的源码改动当前实现继续演进strptime的实现与测试仍在持续维护如_calc_julian_from_U_or_W对%U/%W周数换算的处理见 Lib/_strptime.py测试中的 UCRT 缺陷跳过逻辑见 Lib/test/support/init.pyWindows 运行时打包机制也在PCbuild与PC/layout/中不断强化——这正是从一条 3.5 时代的新闻条目出发沿着源码与测试把历史问题映射到当代实现的研究方法。小结本文围绕 Misc/NEWS.d/3.5.0rc4.rst 逐条还原了 CPython 3.5.0rc4 的两项发布前修复Library 分类下的test_strptimeMemoryError 修复以及 Build 分类下对部分静态构建选项的回退与vcruntime140.dll随安装分发的调整。通过Lib/_strptime.py、Lib/test/test_strptime.py、PCbuild/pythoncore.vcxproj、PC/layout/等当前仓库文件可以确认这两类问题在当代代码库中的持续存在形态与防护机制也让这份十余年前的发布记录具备了可对照、可验证的技术价值。赞分享编程语言语言运行时解释器标准库【免费下载链接】cpythonThe Python programming language项目地址https://gitcode.com/GitHub_Trending/cp/cpython点击查看免费下载相关推荐CPython 3.15.0a4 发布说明深度解读核心运行时修复、JIT 与 free-threading 改进及新 API 详解CPython 3.15.0a4 发布说明深度解读核心运行时修复、JIT 与 free threading 改进及新 API 详解 本篇技术指南以 CPyth编程语言语言运行时解释器标准库Linux crontab 定时任务完全指南掌握排程与排障的 5 个操作Linux crontab 定时任务完全指南掌握排程与排障的 5 个操作 本文出自开源项目 linux tutorial一个整理 Linux 命令与运维脚本文档教程运维Nix 2.21.0 发布说明深度解读安全修复、调试器增强与 CLI 行为变更Nix 2.21.0 发布说明深度解读安全修复、调试器增强与 CLI 行为变更 导读 本文基于 Nix 2.21.0 官方发布说明 https://link.包管理器开发工具CLI构建工具上一篇终极OpenCore EFI智能配置工具3步快速打造完美黑苹果系统下一篇Akagi雀魂AI助手3个步骤让你的麻将水平提升一个段位创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表