This release is a pre-release and may not be stable for production use.
pwasm
A pure Python WebAssembly runtime.
Warning: This is alpha software. It is significantly slower than WebAssembly runtimes with native extensions like wasmtime-py.
Overview
pwasm is a WebAssembly runtime written entirely in Python with zero external dependencies. It can load and execute .wasm binary modules without requiring any C extensions.
Features
- Pure Python - No external dependencies or C extensions required
- WebAssembly MVP support - Parses and executes WebAssembly 1.0 binary format
- Pythonic API - Access exported functions directly as Python methods
- i32 arithmetic - Full support for 32-bit integer operations
- Control flow - Blocks, loops, conditionals, and branching instructions
- Local and global variables - Get, set, and tee operations with mutability checking
- Memory support - Linear memory with data segment initialization
Installation
pip install pwasm
Or with uv:
uv add pwasm
Requirements
- Python 3.10+
Usage
Loading and Running a WebAssembly Module
from pwasm import decode_module, instantiate
# Load a WASM module from bytes
with open("module.wasm", "rb") as f:
wasm_bytes = f.read()
module = decode_module(wasm_bytes)
instance = instantiate(module)
# Call exported functions directly
result = instance.exports.add(2, 3)
print(result) # 5
Working with Multiple Functions
from pwasm import decode_module, instantiate
module = decode_module(wasm_bytes)
instance = instantiate(module)
# Arithmetic operations
print(instance.exports.add(10, 20)) # 30
print(instance.exports.sub(50, 8)) # 42
print(instance.exports.mul(6, 7)) # 42
Error Handling
from pwasm import decode_module, instantiate
from pwasm.errors import TrapError, DecodeError
# Handle runtime traps (e.g., division by zero)
try:
instance.exports.div_s(10, 0)
except TrapError as e:
print(f"Runtime trap: {e}")
# Handle malformed WASM
try:
module = decode_module(b"invalid wasm")
except DecodeError as e:
print(f"Decode error: {e}")
Architecture
Components
- decoder.py - Parses WebAssembly binary format with LEB128 decoding
- types.py - WebAssembly type system (i32, i64, f32, f64, funcref, externref)
- executor.py - Stack-based bytecode interpreter
- errors.py - Exception hierarchy (WasmError, DecodeError, ValidationError, TrapError, LinkError)
Execution Model
pwasm uses a stack-based execution model faithful to the WebAssembly specification:
- Value Stack - Operand values for instructions
- Call Stack - Function frames with locals and return addresses
- Control Flow - Pre-computed block/loop/if targets for branching
Development
# Clone and setup
git clone https://github.com/simonw/pwasm
cd pwasm
# Run tests
uv run pytest
# Format code
uv run black .
License
Apache 2.0
Release files for pwasm 0.1a0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pwasm-0.1a0.tar.gz | 15.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pwasm-0.1a0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.0 kB
Release files / pwasm-0.1a0.tar.gz
| Download URL | pwasm-0.1a0.tar.gz |
|---|---|
| Size | 15.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
094ee79c46354678491d7d120e6ac63105684bb88e193452bf7ebe97e4f07ad0
|
|
BLAKE2b-256 checksum How to use checksums |
6df1bbedcac2198ee27cba4589f8597f125f6b6cfed8e7cb86ea8503010abcbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 10, 2026.
Transparency logRelease files / pwasm-0.1a0-py3-none-any.whl
| Download URL | pwasm-0.1a0-py3-none-any.whl |
|---|---|
| Size | 17.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
13066ed79ce8c82e34af9cf5240e4ebe39e31f6efbc9e30e254dc6ece5eea379
|
|
BLAKE2b-256 checksum How to use checksums |
24963fa1081b680869b90824b031ef4566ad1fba4c9258de4443cd6f6f859431
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 10, 2026.
Transparency log