Wasmer SDK for Python
Run Wasmer packages in lightweight, composable sandboxes from Python. The
public API is handwritten and typed; a Python-independent UniFFI library calls
the Rust wasmer-sdk underneath.
Install
pip install wasmer-sdk
Published wheels support macOS and Linux on arm64 and x86_64. One wheel works across supported Python 3 versions on the same platform because the native boundary does not use the CPython ABI.
Load or create a package from Wasm
Load a single raw WASI/WASIX module with
pkg = await wasmer.packages.load(Path("hello.wasm").read_bytes()).
Byte sources detect Wasm or WEBC by their contents. Raw modules must export
_start; their single command and entrypoint are named main automatically.
Run with sandbox.command(pkg) or sandbox.command("main"). WEBC packages
retain their declared commands and entrypoint.
Create a reusable package from module bytes and optional bundled files:
from pathlib import Path
from wasmer_sdk import PackageCommandDefinition, PackageDefinition, Wasmer
async def run_module():
async with Wasmer() as wasmer:
pkg = await wasmer.packages.create(PackageDefinition(
modules={"app": Path("hello.wasm").read_bytes()},
commands={"hello": PackageCommandDefinition(module="app")},
files={"/data/config.json": '{"debug":true}'},
))
async with await wasmer.sandboxes.create(packages=[pkg]) as sandbox:
print((await sandbox.command(pkg, ["--help"]).run()).text())
Creation copies module and file data into an in-memory package without a WEBC
archive. Command modules must export _start and run with the existing
WASI/WASIX runner. One command becomes the entrypoint automatically; with
multiple commands, set entrypoint="hello" or select pkg.command("hello").
File keys are absolute guest paths without . or .. segments. Package file
writes use private execution overlays; use the sandbox workspace for persistent
data. The result also works with sandbox.install_package(pkg).
Run Python inside Wasmer
import asyncio
from wasmer_sdk import Wasmer
async def main() -> None:
wasmer = Wasmer()
sandbox = await wasmer.sandboxes.create(
packages=["python/python@=3.13.20"],
files={
"main.py": "print(sum(n * n for n in range(10)))",
},
)
output = await sandbox.command(
"python", ["/workspace/main.py"]
).run()
print(output.text())
asyncio.run(main())
The @= package-version syntax is an exact pin. Use it when a sandbox must
resolve the same Wasmer package version on every run.
Constructing Wasmer() is synchronous. Operations that perform I/O are
awaited. A wasmer instance can be reused across multiple sandboxes. For
long-lived applications and tests, use async with for deterministic cleanup:
async def main() -> None:
async with Wasmer() as wasmer:
sandbox = await wasmer.sandboxes.create(
packages=["python/python@=3.13.20"],
)
async with sandbox:
output = await sandbox.command(
"python", ["--version"]
).run()
print(output.text())
asyncio.run(main())
run() raises ProcessExitError for a non-zero exit, termination, or timeout
by default. Pass check=False when the outcome is expected and should be
inspected as an Output. Spawned-process wait() remains unchecked by
default.
Live processes expose asynchronous stdin, stdout, and stderr streams.
process.stdout.lines() is an async iterator suitable for servers and agent
loops.
Networking and caching
Network access is an explicit sandbox capability:
sandbox = await wasmer.sandboxes.create(
packages=["wasmer/edgejs@0.2.0"],
network="host",
)
Packages and native compiled artifacts are cached in .wasmer by default:
wasmer = Wasmer(cache_root=".cache/wasmer")
The registry and downloaded package layout is shared with Node.js and Rust. Compiled artifacts remain target-specific.
Examples
Run the same guest programs used by the JavaScript and Rust SDK examples:
python3 python/examples/python.py
python3 python/examples/multiple_runtimes.py
python3 python/examples/edgejs_http.py
python3 python/examples/postgres_psql.py
The PostgreSQL example requires psql on PATH; pass
--psql /path/to/psql otherwise. The common guest inputs live in
../fixtures/.
Build and test locally
From the repository root, install Rust 1.95 and build the UniFFI module:
rustup toolchain install 1.95.0 --profile minimal
python3 python/scripts/build.py --release
Binary releases contain Python 3 wheels for Linux x86_64/ARM64 and macOS
Intel/Apple Silicon. Each wheel has a py3-none ABI tag; a separate wheel per
Python minor version is unnecessary. The exact wheels published to PyPI are
also attached to wasmer-sdk-python-v<version> GitHub releases with checksums.
The builder enables native V8/Node-API integration on Linux x86_64 and macOS
Apple Silicon. The pinned V8 build does not support Linux ARM64 or macOS Intel;
those wheels use the sys backend for Wasm/WASI/WASIX and do not support native
N-API guests such as Edge.js. Use --backend sys or --backend napi-v8 to select
the backend explicitly when building locally.
Run the Python suite against that local module:
PYTHONPATH=python/src \
python3 -m unittest discover -s python/tests -v
Run an individual example against the local build:
PYTHONPATH=python/src python3 python/examples/python.py
The PostgreSQL tests require native psql. Set PSQL=/path/to/psql when it is
not on PATH.
The generated _native.py module and platform library are private
implementation details. Applications should import only from wasmer_sdk.
Release files for wasmer-sdk 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| wasmer_sdk-0.3.0-py3-none-manylinux_2_35_x86_64.whl | Python 3 | none | Linux glibc 2.35+ x86-64 | Details |
| wasmer_sdk-0.3.0-py3-none-manylinux_2_34_aarch64.whl | Python 3 | none | Linux glibc 2.34+ ARM64 | Details |
| wasmer_sdk-0.3.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| wasmer_sdk-0.3.0-py3-none-macosx_10_13_x86_64.whl | Python 3 | none | macOS 10.13+ x86-64 | Details |
Total release size: 96.3 MB
Release files / wasmer_sdk-0.3.0-py3-none-manylinux_2_35_x86_64.whl
| Download URL | wasmer_sdk-0.3.0-py3-none-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 34.6 MB |
| Tags | Linux glibc 2.35+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
435efb93d26fe3ab511d7dfe5867f4096075e515dcaeccdeec2d2f7f0e08d5b6
|
|
BLAKE2b-256 checksum How to use checksums |
3848a3e2a4e744c6d148edfbafdc2545fec132393bfc54ff5c6e0c89c4579f8d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 17, 2026.
Transparency logRelease files / wasmer_sdk-0.3.0-py3-none-manylinux_2_34_aarch64.whl
| Download URL | wasmer_sdk-0.3.0-py3-none-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 16.0 MB |
| Tags | Linux glibc 2.34+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
cc243a5fff81cbf89b56c9fbd7e4a034c713b685bac6477d1e3d7fa16eefc190
|
|
BLAKE2b-256 checksum How to use checksums |
a31910df16c47195da00b1abf9878417ae6a8df12ca00c27499bfc154e14f0a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 17, 2026.
Transparency logRelease files / wasmer_sdk-0.3.0-py3-none-macosx_11_0_arm64.whl
| Download URL | wasmer_sdk-0.3.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 29.9 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8e3da6d8455a3d559ba492da824a724ccf67203cc6cf596fa08caf1d33f27297
|
|
BLAKE2b-256 checksum How to use checksums |
77581e28c661d219d20f2e8a3242849f761053054e272db03c48698004387c4c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 17, 2026.
Transparency logRelease files / wasmer_sdk-0.3.0-py3-none-macosx_10_13_x86_64.whl
| Download URL | wasmer_sdk-0.3.0-py3-none-macosx_10_13_x86_64.whl |
|---|---|
| Size | 15.7 MB |
| Tags | Python 3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
11a72b1ede97e69578146d2391a4dd57ed64870dbf4bf5b6d634fac55c92c6d6
|
|
BLAKE2b-256 checksum How to use checksums |
a276355975992f193bc2bffddf8c2c6bd4be0800700923b430b7cad52e5a47ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 17, 2026.
Transparency log