Rust & Wasm: Load Wasm modules in Python

Nikhil Gupta
2 min readJan 29, 2023

--

In the previous article, we embedded Wasmtime in a Rust CLI to dynamically load Wasm modules. This article will load our wasm modules in Python using Wasmtime’s Python integration.

Create a demo wasm module: Quick Recap

Similar to the previous article, let’s first create a basic wasm module that will expose a simple function to add two numbers, which we will later load in our python script.

Let’s first create a new library like so:

cargo new demo-wasm --lib

and modify the type in Cargo.toml:

[dependencies]

+[lib]
+crate-type = ["cdylib", "rlib"]

Next, let’s modify our lib.rs to expose the function:

#[no_mangle]
pub extern "C" fn add(left: u32, right: u32) -> u32 {
left + right
}

Finally, let’s build our wasm:

cargo build --target wasm32-wasi --release

As expected, we are targeting wasi, a modular interface for WebAssembly which is implemented by Wasmtime, that provides access to OS-like-features, including files, etc.

Install wasmtime package

Now, we will simply use pip package manager to install wasmtime like so:

pip install wasmtime

Load wasm module in python

Next, let’s create a python script and copy the demo_wasm to the same folder. Finally, let’s use the wasmtime.loader to load our wasm module.

import wasmtime.loader
import demo_wasm

Call wasm module from python

Now, we should have all our exposed functions directly available in python. Let’s call our add function like so:

print(demo_wasm.add(1, 2))

Now, if you run the updated app, you should see 3 printed on the terminal :) This way, we can load any Wasm module into our Python app!

If you liked this article, subscribe here to get the complete code and updates for the entire collection:

--

--

Responses (1)