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 を使用するのか?

以下のような場合に最適です:

  1. Rust や C で書かれた小規模かつパフォーマンスクリティカルな計算を実行したい場合。
  2. Python プロセスを再起動せずにサードパーティのコードをサンドボックス化したい場合。
  3. Python と WASM モジュールを混在させるポリグロットサーバーを構築している場合。
  4. 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 ライセンスの下でオープンソースです。貢献は歓迎します:

  1. リポジトリをフォークする。
  2. 機能ブランチを作成する。
  3. pytest でテストスイートを実行する。
  4. 明確な説明付きでプルリクエストを作る。
  5. レビューは GitHub の標準ワークフローに従う。

CONTRIBUTING.md でガイドラインとコーディングスタイルを確認してください。

今後の計画

  • コア Wasmtime のリリースに合わせた段階的な API 変更
  • WASI(WebAssembly System Interface)をサポートし、より複雑なアプリを実行できるように
  • 人気の Python 非同期フレームワークとの統合強化
  • データサイエンスや機械学習ワークロード向けの新例

総括

wasmtime‑py は WebAssembly の論理を Python アプリケーションに埋め込むための強力で軽量なツールを提供します。新しい言語機能のプロトタイピング、信頼できないコードのサンドボックス化、ポリグロットマイクロサービスの構築など、あらゆる用途に最適です。このライブラリは Wasmtime エンジン以外にランタイムオーバーヘッドを生じさせず、シンプルで扱いやすいです。ぜひお試しください。広範なドキュメントを探索し、Python での WebAssembly エコシステムの成長に貢献してください。

この記事を共有