Skip to main content

Tool to package Python applications as WebAssembly components

Project description

componentize-py

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. See the tests for examples.

For an example of running a sandboxed Python guest within a Python host, see component-sandbox-demo.

Installing from PyPI

pip install componentize-py

Building from source

For the time being, we use a temporary fork of WASI-SDK which enables both shared library support and dlopen/dlsym. Once those features are upstreamed, we'll switch. Specifically, the remaining patches are:

Prerequisites

  • Tools needed to build CPython (Make, Clang, etc.)
  • Rust stable 1.68 or later and nightly 2023-07-27 or later, including the wasm32-wasi and wasm32-unknown-unknown targets
    • Note that we currently use the -Z build-std Cargo option to build the componentize-py runtime with position-independent code (which is not the default for wasm32-wasi) and this requires using a recent nightly build of Rust.

For Rust, something like this should work once you have rustup:

rustup update
rustup install nightly
rustup component add rust-src --toolchain nightly
rustup target add wasm32-wasi wasm32-unknown-unknown

Building and Running

First, make sure you've got all the submodules cloned.

git submodule update --init --recursive

Next, install WASI SDK to /opt/wasi-sdk (alternatively, you can specify an alternative location and reference it later using the WASI_SDK_PATH environment variable). Replace linux with macos or mingw (Windows) below depending on your OS.

curl -LO https://github.com/dicej/wasi-sdk/releases/download/shared-library-alpha-2/wasi-sdk-20.16g86c5c116b0a6-linux.tar.gz
tar xf wasi-sdk-20.16g86c5c116b0a6-linux.tar.gz
sudo mv wasi-sdk-20.16g86c5c116b0a6 /opt/wasi-sdk
export WASI_SDK_PATH=/opt/wasi-sdk

Finally, build and run componentize-py.

cargo run --release -- --help

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.3.1.tar.gz (2.6 MB view hashes)

Uploaded Source

Built Distributions

componentize_py-0.3.1-cp37-abi3-win_amd64.whl (31.5 MB view hashes)

Uploaded CPython 3.7+ Windows x86-64

componentize_py-0.3.1-cp37-abi3-manylinux_2_28_x86_64.whl (34.5 MB view hashes)

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

componentize_py-0.3.1-cp37-abi3-manylinux_2_28_aarch64.whl (34.3 MB view hashes)

Uploaded CPython 3.7+ manylinux: glibc 2.28+ ARM64

componentize_py-0.3.1-cp37-abi3-macosx_11_0_arm64.whl (23.6 MB view hashes)

Uploaded CPython 3.7+ macOS 11.0+ ARM64

componentize_py-0.3.1-cp37-abi3-macosx_10_7_x86_64.whl (24.0 MB view hashes)

Uploaded CPython 3.7+ macOS 10.7+ x86-64

Supported by

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