wasmtime-py : Runtime WebAssembly Python propulsé par Wasmtime
Qu'est-ce que wasmtime‑py?
WebAssembly (WASM) est un format d'instructions binaires conçu pour la vitesse, la sécurité et la portabilité. Il vous permet de compiler du code écrit dans des langages comme C, Rust ou AssemblyScript en un module sandboxé qui s'exécute sur une variété de runtimes.
wasmtime‑py est un wrapper Python autour du moteur Wasmtime, un moteur d'exécution de qualité industrielle développé par la Bytecode Alliance. Il transforme Wasmtime en un package Python de premier niveau, permettant aux développeurs de compiler, d'instancier et d'exécuter des modules WASM directement depuis leur code Python.
Caractéristiques clés :
- Zéro dépendance – le wrapper embarque un binaire Wasmtime statiquement lié ; aucune bibliothèque C externe n'est requise.
- API conviviale Python – expose les modules WASM comme des objets Python normaux avec une gestion d'erreurs claire.
- Support des composants – le modèle « Component » plus récent peut être utilisé comme les modules de base.
- Multi‑plateforme – fonctionne sur Windows, macOS et Linux pour x86_64 et arm64.
Pourquoi utiliser wasmtime‑py ?
Si vous :
- avez besoin d'exécuter un petit calcul critique en performance écrit en Rust ou C.
- souhaitez sandboxer du code tiers sans redémarrer votre processus Python.
- construisez un serveur polyglotte qui mixe Python et modules WASM.
- cherchez un runtime minimal facile à installer via
pip.
alors wasmtime‑py est un choix idéal. Contrairement aux runtimes plus lourds qui regroupent une VM et de nombreux crates d'exécution, cette bibliothèque garde une empreinte réduite (moins de 5 MiB sur disque) tout en offrant une API Python familière.
Installation
pip install wasmtime
Le package détecte automatiquement votre plateforme et télécharge le binaire Wasmtime correspondant. Pour des builds personnalisés ou pour utiliser un wheel pré‑construit d'une version spécifique, vous pouvez fixer la version :
pip install "wasmtime==0.30.0"
Versions Python prises en charge : 3.9+.
Démarrage rapide – Compiler et exécuter un module
from wasmtime import Store, Module, Instance, Func, FuncType
store = Store()
module = Module(store.engine, """
(module
(func $hello (import \"\" \"hello\"))
(func (export \"run\") (call $hello))
)"")
# Définir la fonction hôte importée
def say_hello():
print("Hello from Python!")
hello = Func(store, FuncType([], []), say_hello)
# Instancier le module, en passant la fonction hôte
instance = Instance(store, module, [hello])
run = instance.exports(store)["run"]
run(store)
Sortie :
Hello from Python!
Importer des modules WASM pré‑compilés
WASMTIME‑PY peut automatiquement charger un module compilé disponible comme module Python. Le loader fonctionne pour les fichiers suivant la convention de paquets de nom de domaine PEP 420.
# Supposons que vous ayez compilé my_module.wasm et l'ayez placé à côté de ce script
import wasmtime.loader # enregistre le loader personnalisé
import my_module
my_module.run()
Dans les coulisses, le loader compile le fichier .wasm à la première importation et met en cache l'Instance résultante.
Utiliser les composants
Le Modèle de Composants étend l'idée WebAssembly de base avec des imports/exports plus riches et une sûreté de type. Il est entièrement pris en charge :
from wasmtime import Store, Component
store = Store()
component = Component(store.engine, """
(component "hello"
(import "hello" (func (type 0)))
(export "hello" (func 0)))
)"")
# Les instances de composants prennent une liste de fonctions hôtes correspondant au type d'importation du composant
instance = component.instantiate(store, [hello])
instance.exports(store)["hello"](store)
Contribuer
wasmtime‑py est open source sous licence Apache‑2.0. Les contributions sont les bienvenues :
- Forkez le dépôt.
- Créez une branche de fonctionnalité.
- Exécutez la suite de tests avec
pytest. - Soumettez une pull request avec une description claire.
- La revue suit le workflow GitHub standard.
Consultez le CONTRIBUTING.md pour les lignes directrices et le style de code.
Plans futurs
- Changements d'API incrémentaux liés aux versions principales de Wasmtime.
- Support de WASI (WebAssembly System Interface) pour exécuter des applications plus complexes.
- Meilleure intégration avec les frameworks async Python populaires.
- Nouveaux exemples ciblant les charges de travail data science et machine learning.
Conclusion
wasmtime‑py vous offre un outil puissant et léger pour intégrer la logique WebAssembly dans vos applications Python. Que vous prototypez une nouvelle fonctionnalité linguistique, sandboxiez du code non fiable ou construisiez un microservice polyglotte, cette bibliothèque rend la tâche simple, sans surcharge d'exécution supplémentaire par rapport au moteur Wasmtime. Essayez‑la, explorez la documentation complète et contribuez à l'écosystème grandissant du WebAssembly pour Python.