向PyPI发布WASM wheels以用于Pyodide
Publishing WASM wheels to PyPI for use with Pyodide
Pyodide 314.0 发布,支持将符合 PEP 783 的 Python 包直接发布到 PyPI 并在运行时安装,此前维护者需自行构建托管超 300 个包。PyPI 相关 PR 已于 4 月 21 日合并。开发者 Simon Willison 打包了 Roblox 开发的 Luau 语言为 luau-wasm 包(276KB),通过 GitHub Actions 发布至 PyPI。目前已有 28 个包使用新 `pyemscripten_202*_wasm32` 标签发布,包括 uuid7-rs、imgui-bundle、onnx 等。
Pyodide 314.0 发布公告
Pyodide 314.0 发布公告(via Hacker News)包含了我期待已久的消息:你现在可以将为 Pyodide(或任何兼容 PEP 783 定义的 PyEmscripten 平台的 Python 运行时)构建的 Python 包直接发布到 PyPI,并在运行时安装。此前,Pyodide 维护者必须自行维护、构建和托管超过 300 个包。这给我们的维护者带来了巨大负担,并成为社区的主要瓶颈,因为每个新包都需要人工审核。今后,包维护者可以像为 Linux、macOS 或 Windows 构建原生 wheel 一样,直接将 Pyodide wheel 构建并发布到 PyPI。这是支持此功能的 PyPI 本身的 PR,已于 4 月 21 日合并。我非常喜欢 Pyodide,过去一直受限于此功能而感到沮丧。虽然可以在 wheel 文件中将 C 或 Rust 扩展编译为 WASM,但此前没有简便的分发方式。感谢许多人的努力,这个问题现在终于解决了!
用 luau-wasm 进行尝试
我决定通过打包一些东西来庆祝。我手头有不少实验性的 Pyodide 项目,但最合适的似乎是 3 月 9 日做的 Luau WebAssembly 研究 spike。Luau 是一种"基于 Lua 的小型、快速、可嵌入的编程语言,具有渐进类型系统",由 Roblox 开发并以 MIT 许可证发布。它用 C++ 编写。我早就知道可以将其编译为 WebAssembly 并在 Pyodide 中运行,于是我让 Codex + GPT-5.5 xhigh 负责打包我的实验并通过 GitHub Actions 发布到 PyPI。经过几次迭代,结果如下:luau-wasm 是一个全新的 PyPI 包,发布了一个 276KB 的 luau_wasm-0.1a0-cp314-cp314-pyemscripten_2026_0_wasm32.whl 文件,可以在 Pyodide 中这样使用:
import micropip
await micropip.install("luau-wasm")
import luau_wasm
print(luau_wasm.execute(r'''
local animals = {"fox", "owl", "frog", "rabbit"}
table.sort(animals, function(a, b) return #a < #b end)
for i, name in ipairs(animals) do
print(i .. ". " .. name .. " (" .. #name .. ")")
end
'''))
你可以在 Pyodide REPL 演示中运行这段代码来查看效果。luau-wasm 的 GitHub 仓库包含所有构建和部署脚本(使用最新的 cibuildwheel),还部署了一个 HTML 演示页面,该页面加载 Pyodide、安装 luau-wasm 并提供试用界面:https://simonw.github.io/luau-wasm/
目前有多少包在使用这个功能?
我很好奇目前有多少包在为此平台发布 wheel。经过与 ChatGPT 的一些调试,我得到了这个 BigQuery SQL 查询,并在 PyPI 的 BigQuery 公共数据集上运行。这是查询结果的原始 JSON,这是 Datasette Lite 中的 SQLite SQL 查询,用于按最近上传日期去重包。如果查询正确,目前有 28 个 PyPI 包使用新的 pyemscripten_202*_wasm32 标签发布:
- luau-wasm
- uuid7-rs
- cmm-16bit
- pyOpenTTDAdmin
- imgui-bundle
- numbertoolkit
- bashkit
- geoarrow-rust-core
- arro3-io
- arro3-core
- arro3-compute
- onnx
- powerfit-em
- tcod
- chonkie-core
- tokie
- robotraconteur
- pydantic_core
- yaml-rs
- cadquery-ocp-novtk-OCP.wasm
- uuid_utils
- base64_utils
- pycdfpp
- lib3mf-OCP.wasm
- typst
- toml-rs
- onnx-weekly
- dummy-pyodide-ext-test
希望在未来的几个月和几年里,我们能看到更多这样的包出现。
标签:lua, pypi, python, sandboxing, webassembly, github-actions, pyodide