WebAssembly in Python.
Wasmpy is a lightweight layer that sits between Python and WebAssembly. When attempting to import a WebAssembly file, the file is converted into machine code for native speeds.
python3 -m pip install wasmpy
To get started, first import the wasmpy
module to register the WebAssembly import hooks.
Then you can just import wasm_or_wat_file
to load a WebAssembly module.
|- my_module
|- __init__.py
|- wasm_math.wat
# __init__.py
import wasmpy
from .wasm_math import add
;; wasm_math.wat
(module
(func (export "add") (param i32 i32) (result i32)
(i32.add (local.get 0) (local.get 1))
)
)
>>> import my_module
>>> my_module.add(45, 960)
1005
>>>
Functions exported from WebAssembly can also be accessed from the module by using their name as a key.
For exported names that aren't valid Python identifiers or which start with a _
, this is the only valid way of accessing these functions.
;; wasm_math.wat
(module
(func (export "add one") (param i32) (result i32)
(i32.add (local.get 0) (i32.const 1))
)
)
>>> import wasmpy
>>> import wasm_math
>>> wasm_math["add one"](11)
12
>>>
On Windows this requires mingw-w64
git clone https://github.com/olivi-r/wasmpy.git
cd wasmpy
make -f <linux/windows>.mk
python3 -m pip install .
Wasmpy is still in active development, and only supports x86/x86-64 Windows and Linux machines and lacks some key features:
- most memory instructions
- most control instructions
- imports
- tables
-
Current target:
- Reach compatability with the MVP
-
Future Goals
- Native support for more architectures, particularly those supported by manylinux
- Interfacing with the Python C API from WebAssembly (in conjunction with the Wasmpy sister project wasmpy-build) to allow compiled extension modules that are platform independent
- Compatibility with Pyodide
- Python implementation support for Jython, PyPy etc.
- Support for WebAssembly proposals
- Support for WASI snapshots, as well as support for supersets such as WASIX