Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

pwasm

PyPI Tests Changelog License

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:

  1. Value Stack - Operand values for instructions
  2. Call Stack - Function frames with locals and return addresses
  3. 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)

Source distribution for pwasm 0.1a0
File Size Uploaded
pwasm-0.1a0.tar.gz 15.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pwasm 0.1a0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1a0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page