Skip to main content

Tool to package Python applications as WebAssembly components

Project description

componentize-py

A Bytecode Alliance project

This is a tool to convert a Python application to a WebAssembly component. It takes the following as input:

  • a WIT file or directory
  • the name of a WIT world 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.

Getting Started

First, install Python 3.10 or later and pip if you don't already have them. Then, install componentize-py:

pip install componentize-py

Next, create or download the WIT world you'd like to target, e.g.:

cat >hello.wit <<EOF
package example:hello;
world hello {
  export hello: func() -> 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:

componentize-py -d hello.wit -w hello bindings hello_guest

Then, use the hello module produced by the command above to write your app:

cat >app.py <<EOF
import wit_world
class WitWorld(wit_world.WitWorld):
    def hello(self) -> str:
        return "Hello, World!"
EOF

And finally generate the component:

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:

[!NOTE] Due to compatibility issues with wasmtime-py versions beyond 38.x, this example requires version 38.0.0 or earlier: pip install "wasmtime==38.0.0"

pip install wasmtime==38.0.0
python3 -m wasmtime.bindgen app.wasm --out-dir hello_host

Now we can write a simple host app using those bindings:

cat >host.py <<EOF
from hello_host import Root
from wasmtime import Config, Engine, Store

config = Config()
config.cache = True
engine = Engine(config)
store = Store(engine)
hello = Root(store)
print(f"component says: {hello.hello(store)}")
EOF

And finally run it:

 $ python3 host.py
component says: Hello, World!

See the examples directories for more examples, including various ways to run the components you've created.

Known Limitations

Currently, the application can only import dependencies during build time, which means any imports used at runtime must be resolved at the top level of the application module. For example, if x is a module with a submodule named y the following may not work:

import x

class Hello(hello.Hello):
    def hello(self) -> 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:

from x import y

class Hello(hello.Hello):
    def hello(self) -> str:
        return y.foo()

This limitation is being tracked as issue #23.

See the issue tracker for other known issues.

Contributing

See CONTRIBUTING.md for details on how to contribute to the project and build it from source.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

componentize_py-0.21.0.tar.gz (176.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

componentize_py-0.21.0-cp39-abi3-win_amd64.whl (22.2 MB view details)

Uploaded CPython 3.9+Windows x86-64

componentize_py-0.21.0-cp39-abi3-manylinux_2_28_x86_64.whl (24.0 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

componentize_py-0.21.0-cp39-abi3-manylinux_2_28_aarch64.whl (23.4 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

componentize_py-0.21.0-cp39-abi3-macosx_11_0_arm64.whl (22.5 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

componentize_py-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl (23.3 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file componentize_py-0.21.0.tar.gz.

File metadata

  • Download URL: componentize_py-0.21.0.tar.gz
  • Upload date:
  • Size: 176.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for componentize_py-0.21.0.tar.gz
Algorithm Hash digest
SHA256 695f88bd845fe95fea94181ee0b78b0d2a5c76bc701fbf541a85f083c0389205
MD5 1ba54312b8eb5b57361fa111cbd5e487
BLAKE2b-256 a9d0ca5880d1013e3542480c78a62b39773bcd29cad48ec480896764a710a735

See more details on using hashes here.

File details

Details for the file componentize_py-0.21.0-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for componentize_py-0.21.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 ef38862a8bdb3574b46848f8f8cb7c6c4cd85067f844fad7b24c08ed022e227c
MD5 a8503f5f715224de1a31beba76fc5992
BLAKE2b-256 f2bdee1ffcc1d656cc93eabbd826bccba3b235068fb9cba89749a24b4a32f6f6

See more details on using hashes here.

File details

Details for the file componentize_py-0.21.0-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for componentize_py-0.21.0-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cdc45de3b4b06ed90250dc96c2c11f993e0b8936975e156d239d94c2fa9eca14
MD5 b609afc022bd7a8ffbe67446cfff58f1
BLAKE2b-256 bda5316e2187870a97032e7a59a2183b49a6cb2a336ca2eb30fd3c8f5a62b199

See more details on using hashes here.

File details

Details for the file componentize_py-0.21.0-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for componentize_py-0.21.0-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0e0e18c3c439329eb9ae547cb831bfa3257dbbbdf4b7a5d9dd5420aad43eba66
MD5 9e7bfcd53cfa20a5533d652f4cd544cd
BLAKE2b-256 0827356f2aa8aecd10274500583d84d7a6eef647a2411c5865781d567d249260

See more details on using hashes here.

File details

Details for the file componentize_py-0.21.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for componentize_py-0.21.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b633a1252408619f9bbf7ff6c33b7890d9edb2f3d784d72f588a4ba8eaa2e893
MD5 2886348a001c35d15567803ca34445e6
BLAKE2b-256 46d47693c9b2b3c6e4e1e1fbad1ebc662be4facc3889d4634aeabf93c59c29eb

See more details on using hashes here.

File details

Details for the file componentize_py-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for componentize_py-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ecc0815b0df630a1bbeb7978e1a070e0a46d70b596ac9526b4625c4978c1bcd6
MD5 9d73f0cd345a6eb2416fb8e9f3820f1c
BLAKE2b-256 113c4537d45a3341ea2ff2ec04056cfca431a044b9eaed5f966f13e03a84c0d0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page