Exécute du Python en sandbox avec MicroPython et WebAssembly

Pourquoi ça compte pour toi
Si tu construis un outil qui accepte du code utilisateur (plugins, enrichissements de données, workflows), tu dois l'isoler. MicroPython compilé en WebAssembly + wasmtime te donne des limites strictes : pas d'accès fichiers non approuvés, pas de réseau, CPU et mémoire contrôlés. C'est utile pour Datasette, mais aussi pour n'importe quel service qui exécute du code tiers.
Ce qu'il faut retenir
- 1.MicroPython (version légère de Python 3) compilé en WASM, pas Pyodide (non pris en charge côté serveur)
- 2.Contrôle CPU/mémoire, accès fichiers/réseau strictement défini, fonctions hôtes exposées sélectivement
- 3.État persistant entre appels : variables et fonctions restent en mémoire via des files d'attente et des threads
Tu galères avec le jargon ?
Lis la version réécrite en mode débutant — toutes les idées, sans le jargon.
Pourquoi une sandbox ?
Simon Willison maintient des projets comme Datasette et sqlite-utils qui s'appuient sur des plugins Python. Le problème : un plugin bugué ou malveillant s'exécute avec tous les droits. Un while True: s += "x" peut bloquer l'appli, un plugin curieux peut lire tes fichiers privés ou atteindre le réseau.
Il voulait une sandbox où le code ne peut pas :
- ▸Lire/écrire que les fichiers approuvés
- ▸Se connecter au réseau
- ▸Monopoliser le CPU/RAM sans limite
Mais il fallait aussi que ce soit :
- ▸Installable via PyPI sans effort supplémentaire
- ▸Maintenu et documenté (pas un projet zombie)
- ▸Capable d'exposer des fonctions hôtes sélectionnées
Pourquoi WebAssembly ?
Les navigateurs exécutent du code hostile tous les jours. Les moteurs JavaScript (V8, SpiderMonkey) sont très sécurisés mais énormes et mal documentés pour l'intégration embarquée. WebAssembly a été conçu pour ça depuis le début : conception simple, éprouvée 10 ans en production, et wasmtime (le runtime Python) est maintenu avec des binaires pré-compilés.
Pour Python en WASM, Pyodide existe mais uniquement en navigateur. Simon a essayé MicroPython—une implémentation légère de Python 3 optimisée pour les microcontrôleurs. Pourquoi pas ? C'est un environnement contraint, WebAssembly aussi.
Comment ça marche ?
Le plus technique : GPT l'a aidé à déterrer une PR MicroPython sur le support WASI expérimental, puis il a demandé aux agents IA de compiler une version WASM personnalisée.
Le plus astucieux : l'état persistant. Le binaire WASM de base démarre l'interpréteur, exécute le code, puis l'arrête. Pour conserver des variables entre appels, Simon a créé une boucle à l'intérieur de MicroPython qui :
- ▸Appelle une fonction hôte
get_next_python_code() - ▸Cette fonction bloque et attend du code via une file d'attente (thread côté Python)
- ▸Exécute le code via
eval() - ▸Renvoie le résultat via
__session_result__()
Résultat : tu peux faire ça :
from micropython_wasm import MicroPythonSession
with MicroPythonSession() as session:
print(session.run("x = 10\nprint(x)").stdout) # 10
print(session.run("x += 5\nprint(x)").stdout) # 15
print(session.run("print(x * 2)").stdout) # 30
Les variables survivent d'un appel à l'autre.
Le reste ?
78 lignes de C pour exposer les fonctions hôtes, compilées dans un blob WASM de 362 KB. Simon a demandé aux IA d'expliquer le C après coup—bon signe qu'il ne comprend pas tout mais teste agressivement.
C'est en alpha. Le code est sur GitHub. À tester si tu construis quelque chose qui exécute du Python utilisateur.
Et concrètement pour toi ?
Choisis ton profil — la lecture de l'article change selon qui tu es.
Pour toi, l'idée clé : exécuter du code utilisateur sans risque, c'est un vieux problème revisité par la vague des plugins et agents IA. MicroPython en WASM montre comment des outils légers peuvent remplacer des solutions lourdes—c'est la tendance du "small but solid" en tech.
Essayer maintenant
Installer micropython-wasm →Source
Pour aller plus loin
Cet article t'a donné envie d'approfondir ? Deux formations Noésis t'attendent :
Explorer les thèmes de cet article :