https://github.com/bytecodealliance/componentize-py
https://github.com/bytecodealliance/componentize-py
Last synced: 22 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/bytecodealliance/componentize-py
- Owner: bytecodealliance
- License: apache-2.0
- Created: 2023-03-28T23:14:10.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2025-07-02T00:00:52.000Z (7 months ago)
- Last Synced: 2025-07-12T00:44:55.418Z (7 months ago)
- Language: Rust
- Size: 881 KB
- Stars: 208
- Watchers: 12
- Forks: 28
- Open Issues: 22
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
- awesome-wavs - componentize-py - Convert a Python app to a WebAssembly component. (WASM/WASI 🕸️)
- awesome-wasm-components - `componentize-py`
README
# componentize-py
**A [Bytecode Alliance](https://bytecodealliance.org/) project**
This is a tool to convert a Python application to a [WebAssembly
component](https://github.com/WebAssembly/component-model). It takes the
following as input:
- a [WIT](https://github.com/WebAssembly/component-model/blob/main/design/mvp/WIT.md) file or directory
- the name of a [WIT world](https://github.com/WebAssembly/component-model/blob/main/design/mvp/WIT.md#wit-worlds) defined in the above file or directory
- the name of a Python module which targets said world
- a list of directories in which to find the Python module and its dependencies
The output is a component which may be run using
e.g. [`wasmtime`](https://github.com/bytecodealliance/wasmtime).
## Getting Started
First, install [Python 3.10 or later](https://www.python.org/) and
[pip](https://pypi.org/project/pip/) if you don't already have them. Then,
install `componentize-py`:
```shell
pip install componentize-py
```
Next, create or download the WIT world you'd like to target, e.g.:
```shell
cat >hello.wit < string;
}
EOF
```
If you're using an IDE or just want to examine the bindings produced for the WIT
world, you can generate them using the `bindings` subcommand:
```shell
componentize-py -d hello.wit -w hello bindings hello_guest
```
Then, use the `hello` module produced by the command above to write your app:
```shell
cat >app.py < str:
return "Hello, World!"
EOF
```
And finally generate the component:
```shell
componentize-py -d hello.wit -w hello componentize --stub-wasi app -o app.wasm
```
To test it, you can install `wasmtime-py` and use it to generate host-side
bindings for the component:
```shell
pip install wasmtime
python3 -m wasmtime.bindgen app.wasm --out-dir hello_host
```
Now we can write a simple host app using those bindings:
```shell
cat >host.py < str:
return x.y.foo()
```
That's because importing `x` does not necessarily resolve `y`. This can be
addressed by modifying the code to import `y` at the top level of the file:
```python
from x import y
class Hello(hello.Hello):
def hello(self) -> str:
return y.foo()
```
This limitation is being tracked as [issue
#23](https://github.com/bytecodealliance/componentize-py/issues/23).
See [the issue tracker](https://github.com/bytecodealliance/componentize-py/issues) for other known issues.
## Contributing
See
[CONTRIBUTING.md](https://github.com/bytecodealliance/componentize-py/tree/main/CONTRIBUTING.md)
for details on how to contribute to the project and build it from source.