Open2

pythonプログラムからwasmをimportして実行するコードスニペット

PINTOPINTO

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/
    
  • watwasm にコンパイル

    wat2wasm add.wat -o add.wasm
    

  • wasmer (Pythonラッパ) のインストール

    pip install wasmer wasmer_compiler_cranelift
    
  • Pythonのテストコードを作成

    test.py
    from 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
    
PINTOPINTO

2. pythonのコードをwasmバイナリ化してpythonのコードでimportするパターン

https://pypi.org/project/py2wasm/

https://github.com/wasmerio/py2wasm/tree/develop

  • 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