作为将Python带入浏览器的重要项目,Pyodide持续推动WebAssembly与Python生态系统的深度融合。2025年7月4日,Pyodide团队正式发布了备受期待的0.28.0版本,此次更新不仅在标准化平台方面迈出关键步伐,还在运行性能、包管理和图形渲染等各个方面实现了显著提升,为浏览器端Python应用的未来发展注入强劲动力。 Pyodide 0.28版本的核心亮点集中在定义Pyodide ABI(Application Binary Interface,应用二进制接口)上。2024年10月,CPython指导委员会批准Emscripten重新作为Python 3.14及以后的官方三级支持目标。配合PEP 776和PEP 783的出台,Pyodide团队积极响应Python社区对WebAssembly运行时环境和打包机制的标准化诉求。 定义明确的Pyodide ABI对于构建稳定兼容的生态系统至关重要。
通过为每个Python版本设定独立ABI,Pyodide确保同版本的包可在不同Pyodide发行版之间顺利兼容,极大地降低了维护和分发成本。本次发布中的ABI设计面向未来,预期在PEP 783获批后,Pyodide将能在PyPI上以独特平台标签上传兼容的wheel包,极大提升社区参与度和包的可获取性。 在包管理体系方面,Pyodide 0.28作出了一项变革性的改进:彻底解除预装包与Pyodide运行时的绑定。过去由于技术环境限制,Pyodide将所有包与运行时代码一起打包,这导致包的更新周期受限且构建测试效率低下。每次主代码库提交都需重构250多个包,持续数小时的CI过程极大限制了开发和迭代速度。 此次更新将所有包的构建迁移至pyodide-recipes独立仓库,运行时仓库仅保留核心测试必需组件。
此举使得包能独立于运行时发布,实现更频繁、更灵活的迭代。社区开发者也能更便捷地贡献与维护,提高生态体系的活力和响应能力,从而满足不断增长的浏览器端Python应用需求。 在Python版本支持方面,Pyodide 0.28全面引入了Python 3.13。这意味着用户可以使用最新Python语言特性,同时享受到基于Emscripten 4.0.9构建的全新ABI带来的性能和兼容性优势。然而,新版本也带来了部分包的暂时禁用,主要缘由是这些包的维护者尚未根据新ABI进行重新构建。被暂时禁用的诸如duckdb、pyarrow和polars等重量级数据处理库,未来随着社区协作推进,有望逐步恢复。
图形渲染是Pyodide极具特色的功能之一。在此版本中,Pyodide宣布弃用早期自定义的Matplotlib后台,包括广为人知的wasm_backend和html5_canvas,有着多位核心开发者的历史贡献。这些后台虽然实现了基础的浏览器绘图功能,但随着Matplotlib和浏览器技术的进步和版本迭代,其维护难度和兼容性问题逐渐显现。 为了解决这一痛点,团队采用了经过改良的官方WebAgg后台作为新的默认Matplotlib绘图支持方案。该后台不仅保证了功能的完整性和稳定性,更带来了更丰富的交互能力和更佳的用户体验。得益于Matplotlib核心开发者兼JupyterLite维护者Ian Thomas的倾力支持,这一改进成为Pyodide图形处理领域的重要里程碑。
Pyodide 0.28还引入了对Emscripten模块运行时路径的支持,解决了动态链接库依赖定位长久存在的技术难题。此前,由于WebAssembly共享库格式缺少对运行时路径的支持,必须通过自定义补丁实现包内依赖的正确加载,这不仅带来额外bug风险,也限制了动态链接库的延迟加载能力。 更新后的运行时路径机制允许动态库精准指明其依赖的位置,简化加载流程并提高稳定性。这一改进是WebAssembly标准、llvm工具链和emcc链接器多方协作的结果,从而推动了生态系统的现代化演进。此外,pyodide-build工具也同步更新,以自动生成必要的运行时路径信息,释放了Pyodide团队维护补丁的负担,使维护周期大大缩短。 同时,Pyodide在与JavaScript的集成层面也获得突破。
随着JavaScript Promise Integration (JSPI)在2025年4月成为Stage 4最终提案,并被Chrome 137浏览器默认支持,Pyodide顺利开启了默认启用JSPI关键特性的新时代。用户无需额外配置即可享受asyncio.run()和loop.run_until_complete()等异步协作的无缝执行,极大提升了在浏览器中运行异步Python代码的便捷性和效率。 此外,在Python和JavaScript之间的外部函数接口(FFI)中对null值的支持也得到改进。过去由于wasm externref的表现限制,null和undefined在转换过程中无法完全区分,导致某些JavaScript API表现异常。如今,得益于WebAssembly垃圾回收扩展的引入,FFI内部错误信号和null的判别变得更加准确,已经成为所有主流JavaScript运行时的标配。此举不仅提升了FFI接口的健壮性,也为未来更复杂的跨语言交互奠定坚实基础。
Pyodide 0.28版本的发布还强调了社区力量的重要性。诸如SPy静态类型Python项目展示了Pyodide在高性能图形和计算领域的潜力。Chan Zuckerberg基金会支持的“Scientific Python”项目,推动了基于JupyterLite的交互式文档和在线科学计算库的深入融合,进一步丰富了Pyodide应用场景。团队对Emscripten、CPython和cibuildwheel社区的持续支持表示感谢,同时呼吁更多开发者参与到包构建、修复和功能开发中,共同推动Pyodide生态的蓬勃发展。 总的来看,Pyodide 0.28不仅带来了技术上的标准化与优化,也极大地释放了生态系统的活力和创新潜力。随着浏览器平台和WebAssembly技术的成熟,Pyodide正稳步走向成为连接Python强大计算能力与现代Web应用的桥梁。
未来,随着PEP 783的进一步推进和社区贡献的不断壮大,Pyodide有望成为在浏览器端实现跨语言高性能计算的关键基础设施。对所有关注前端计算、科学计算和Web生态的开发者而言,Pyodide 0.28无疑是一剂强心针,标志着Python在Web时代焕发新的生命力。