PyodideのWASMホイールがPyPIに公開できるようになった件

鈴木 蓮
鈴木 蓮 20代・ ソフトウェアエンジニア
Simon Willisonのブログを読んで、思わずSlackに貼り付けた。Pyodide 314.0でついにWASMホイールをPyPIに直接publishできるようになった、という話だ。

これ、地味にえぐいアップデートだと思う。今まではPyodideチームが300以上のパッケージを自分たちでビルドして管理していたらしい。毎回手動レビューが必要で、新しいパッケージを追加するたびにボトルネックになっていた、というのが公式の言葉だ。それがPEP 783で定義されたPyEmscriptenプラットフォームに対応したことで、パッケージメンテナが普通にLinux/macOS/Windows向けのホイールを出すのと同じ感覚でWASMホイールをPyPIにpushできるようになった。

Simon自身も早速luau-wasmというパッケージを作って試している。Robloxが開発してMITライセンスで公開しているLua系言語のLuauをWASMにコンパイルして、276KBのwhlファイルとしてPyPIに上げた、という内容だ。GitHubActionsとcibuildwheelを使ったbuild/deployスクリプトも公開されていて、再現性が高そうだった。

import micropip
await micropip.install("luau-wasm")
import luau_wasm
print(luau_wasm.execute('print("hello from luau")'))

これをブラウザのPyodide REPLで動かせるのが神。サーバーサイドのランタイムなしにPythonからLuaスクリプトを実行できる、というユースケースがブラウザ上で完結する。

自分のプロジェクトに引きつけると



去年の秋ごろ、個人開発でPyodideをゴリゴリ使った小ツールを作った。ブラウザだけで動くPythonスクリプト実行環境を作ろうとして、C拡張が絡むライブラリを使いたかったのにPyodideのパッケージ一覧に入っていなくて詰んだ経験がある。そこで諦めてpure-Python代替に切り替えたんだが、あの判断を今の自分ならしなくて済むかもしれない。

今現在PyPIにpyemscripten_202*_wasm32タグのついたパッケージが何個あるか、SimonがBigQueryで調べていた。結果は28パッケージ。luau-wasm、pydantic_core、onnx、typstなどが並んでいる。pydantic_coreが入ってるのがデカい。ブラウザPythonアプリでpydanticがそのまま使えるようになるなら、validation layerの書き方が全然変わってくる。

自分が今ハマっているのは、社内向けのちょっとしたデータ整形ツールをWeb完結にしたいという要件だ。バックエンドに渡すのが面倒なケースで、ブラウザだけで処理を完結させたい場面はわりとある。今まではJSで書き直すか、serverless functionを立てるかで妥協していた。PyodideでPythonそのまま動けば、既存のpure-Pythonロジックを再利用できる。

自分が次に試すこと



まずcibuildwheelのWASM対応ブランチのドキュメントを読む。それとluau-wasmのGitHub Actionsのyamlを全部読んでおきたい。

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build WASM wheel
        uses: pypa/cibuildwheel@v3
        env:
          CIBW_PLATFORM: pyodide

こんな感じのyamlがあると想像しているが、実際のシンタックスは確認が必要だ。自分がRustで書いた小さなCLIツールをWASM化してブラウザから呼べるか、週末に試してみるつもりだ。彼女に「また週末もパソコンやるの」と言われるのはわかってるが、これはさすがに動かしてみないと気が済まない。

まだ28パッケージしかないエコシステムに今から触れるのはおいしいタイミングだ。自分が個人開発で使っているツールをPyPIにWASMホイールとしてpublishする最初の数十人に入れるかもしれない。それだけで十分モチベーションになる。

無料相談受付中

AI開発・DX推進についてお気軽にご相談ください。オンライン30分から。

無料相談を申し込む