Open2
pythonプログラムからwasmをimportして実行するコードスニペット
1. wasmのテキスト表現からpythonでimport可能なwasmバイナリを生成するパターン
-
wat (wasmのテキスト表現)
の作成add.wat(module (func $add (param $a i32) (param $b i32) (result i32) local.get $a local.get $b i32.add) (export "add" (func $add)))
-
wat2wasm (wabtの一部)
のインストールhttps://github.com/WebAssembly/wabt
wget https://github.com/WebAssembly/wabt/releases/download/1.0.36/wabt-1.0.36-ubuntu-20.04.tar.gz tar -zxvf wabt-1.0.36-ubuntu-20.04.tar.gz sudo cp wabt-1.0.36/bin/* /usr/local/bin/
-
wat
をwasm
にコンパイルwat2wasm add.wat -o add.wasm
-
wasmer (Pythonラッパ)
のインストールpip install wasmer wasmer_compiler_cranelift
-
Pythonのテストコードを作成
test.pyfrom wasmer import engine, Store, Module, Instance from wasmer_compiler_cranelift import Compiler # WebAssemblyエンジンとストアを作成 store = Store(engine.JIT(Compiler)) # WASMバイナリをロード with open('add.wasm', 'rb') as f: wasm_bytes = f.read() # モジュールをコンパイル module = Module(store, wasm_bytes) # インスタンスを作成 instance = Instance(module) # 関数を呼び出す add = instance.exports.add result = add(3, 4) print(f"3 + 4 = {result}")
-
実行
python test.py 3 + 4 = 7
2. pythonのコードをwasmバイナリ化してpythonのコードでimportするパターン
- wasm 化する python のテストコードを作成hello.py
def talk(message): return "Talk " + message def main(): print(talk("Hello World")) if __name__ == "__main__": main()
- pythonコードをwasm化するツールのインストール
pip install py2wasm
-
.py
を.wasm
にコンパイルpy2wasm hello.py -o hello.wasm