wasmtime‑py: Wasmtime を搭載した Python WebAssembly ランタイム
wasmtime‑py とは?
WebAssembly (WASM) は、速度、安全性、ポータビリティを重視したバイナリ命令フォーマットです。C、Rust、AssemblyScript などの言語で書かれたコードをサンドボックス化されたモジュールにコンパイルし、さまざまなランタイムで実行できます。
wasmtime‑py は、Bytecode Alliance が開発した業界レベルの実行エンジン Wasmtime の Python ラッパーです。Wasmtime を第一級の Python パッケージに変換し、Python コードから直接 WASM モジュールのコンパイル、インスタンス化、実行を可能にします。
主な特徴:
- ゼロ依存性 – ラッパーは静的リンクされた Wasmtime バイナリを付属し、外部 C ライブラリは不要です。
- Python に優しい API – WASM モジュールを標準の Python オブジェクトとして公開し、エラーハンドリングが明確です。
- コンポーネントサポート – 新しい「Component Model」をコアモジュールと同様に利用できます。
- クロスプラットフォーム – Windows、macOS、Linux の x86_64 および arm64 に対応します。
なぜ wasmtime‑py を使用するのか?
以下のような場合に最適です:
- Rust や C で書かれた小規模かつパフォーマンスクリティカルな計算を実行したい場合。
- Python プロセスを再起動せずにサードパーティのコードをサンドボックス化したい場合。
- Python と WASM モジュールを混在させるポリグロットサーバーを構築している場合。
pipで簡単にインストールできるミニマルなランタイムを求めている場合。
wasmtime‑py は、VM と多数のランタイムクレートをバンドルする重いランタイムとは対照的に、ディスク上で 5 MiB 未満のファットを保ちつつ、親しみやすい Python API を提供します。
インストール
pip install wasmtime
パッケージは自動的にプラットフォームを検出し、対応する Wasmtime バイナリをダウンロードします。カスタムビルドや特定のリリースからプリビルドのホイールを使用したい場合はバージョンを固定します:
pip install "wasmtime==0.30.0"
サポートされている Python バージョン: 3.9+。
クイックスタート – モジュールのコンパイルと実行
from wasmtime import Store, Module, Instance, Func, FuncType
store = Store()
module = Module(store.engine, """
(module
(func $hello (import \"\" \"hello\"))
(func (export \"run\") (call $hello))
)"")
# インポートホスト関数の定義
def say_hello():
print("Hello from Python!")
hello = Func(store, FuncType([], []), say_hello)
# ホスト関数を渡してモジュールをインスタンス化
instance = Instance(store, module, [hello])
run = instance.exports(store)["run"]
run(store)
出力:
Hello from Python!
事前コンパイル済み WASM モジュールのインポート
WASMTIME‑PY は、PEP 420 名前空間パッケージ規約に従ったファイルであれば、Python モジュールとして利用できるコンパイル済みモジュールを自動的にロードします。
# 例: my_module.wasm をコンパイルし、スクリプトと同じディレクトリに置いたと仮定
import wasmtime.loader # カスタムローダーを登録
import my_module
my_module.run()
背後では、最初のインポート時に .wasm ファイルをコンパイルし、生成された Instance をキャッシュします。
コンポーネントの使用
Component Model は、コア WebAssembly の考え方に豊富なインポート/エクスポートと型安全性を追加します。完全にサポートされています:
from wasmtime import Store, Component
store = Store()
component = Component(store.engine, """
(component "hello"
(import "hello" (func (type 0)))
(export "hello" (func 0)))
)"")
# コンポーネントインスタンスは、コンポーネントのインポート型に一致するホスト関数のリストを受け取ります
instance = component.instantiate(store, [hello])
instance.exports(store)["hello"](store)
コントリビューション
wasmtime‑py は Apache‑2.0 ライセンスの下でオープンソースです。貢献は歓迎します:
- リポジトリをフォークする。
- 機能ブランチを作成する。
pytestでテストスイートを実行する。- 明確な説明付きでプルリクエストを作る。
- レビューは GitHub の標準ワークフローに従う。
CONTRIBUTING.md でガイドラインとコーディングスタイルを確認してください。
今後の計画
- コア Wasmtime のリリースに合わせた段階的な API 変更
- WASI(WebAssembly System Interface)をサポートし、より複雑なアプリを実行できるように
- 人気の Python 非同期フレームワークとの統合強化
- データサイエンスや機械学習ワークロード向けの新例
総括
wasmtime‑py は WebAssembly の論理を Python アプリケーションに埋め込むための強力で軽量なツールを提供します。新しい言語機能のプロトタイピング、信頼できないコードのサンドボックス化、ポリグロットマイクロサービスの構築など、あらゆる用途に最適です。このライブラリは Wasmtime エンジン以外にランタイムオーバーヘッドを生じさせず、シンプルで扱いやすいです。ぜひお試しください。広範なドキュメントを探索し、Python での WebAssembly エコシステムの成長に貢献してください。