FlowingDev

Python dans un bac à sable : Exécuter le vrai CPython dans votre navigateur

Découvrez comment WebAssembly (WASM) permet d'exécuter le véritable interpréteur CPython et des librairies comme NumPy directement dans un navigateur web, sans aucun serveur.

Essayer l'outil: Python Playground

En une phrase

Un playground Python vous permet d'écrire et d'exécuter du vrai code Python, avec ses bibliothèques populaires, directement dans votre navigateur web, sans avoir besoin d'un serveur ou d'une installation locale, grâce à la magie de WebAssembly.

Le problème que ça résout

Pendant la majeure partie de l'histoire du web, le navigateur était le royaume de JavaScript. Si vous vouliez exécuter du code sur une page web, vous l'écriviez en JS. Point barre. Si vous étiez un Pythonista et que vous vouliez, disons, lancer un script d'analyse de données et afficher les résultats en ligne, vous deviez vous lancer dans toute une cérémonie. Vous écriviez votre code Python, le faisiez tourner sur un serveur, et votre site web allait chercher les résultats. Ce modèle client-serveur est puissant, mais c'est une sacrée surcharge juste pour essayer un petit script ou partager un extrait de code.

Les premières tentatives pour briser ce moule étaient astucieuses mais incomplètes. Des projets comme Brython ou Skulpt étaient essentiellement des traducteurs Python-vers-JavaScript. Ils vous permettaient d'écrire une syntaxe de type Python qui était ensuite convertie en JavaScript puis exécutée par le navigateur. C'était cool à des fins éducatives, mais ce n'était pas du vrai Python. C'était un programme JS déguisé en Python. Fondamentalement, cette approche avait deux inconvénients majeurs :

  1. Elle ne se comportait pas toujours exactement comme l'interpréteur Python officiel (connu sous le nom de CPython). Des différences subtiles pouvaient vous piéger.
  2. Elle ne pouvait pas faire tourner le vaste écosystème de bibliothèques Python qui dépendent d'extensions C pour leurs performances, comme les poids lourds de la data science que sont NumPy et Pandas.

Le problème de fond était de savoir comment faire tourner le véritable interpréteur CPython officiel — celui que vous téléchargez sur python.org — à l'intérieur du bac à sable (sandbox) strict et sécurisé d'un navigateur web. Résoudre ce problème ouvrirait un monde de possibilités : prototypage instantané, outils éducatifs sans aucune installation, et exemples de code vraiment partageables et exécutables pour la collaboration et les rapports de bogues. Cela signifierait que Python pourrait enfin être un citoyen de première classe à l'intérieur du navigateur, et pas seulement un langage vivant sur un serveur lointain.

Comment ça marche sous le capot

Faire tourner CPython, un programme écrit en langage C, dans un navigateur web qui parle JavaScript, ça ressemble à une sorte d'alchimie numérique. Et ça l'est, en quelque sorte ! La pierre philosophale de ce processus est une technologie appelée WebAssembly.

Le héros : WebAssembly (Wasm)

WebAssembly, ou Wasm pour les intimes, c'est l'ingrédient secret. Ne le voyez pas comme un langage que vous écrivez, mais comme un langage vers lequel vous compilez. C'est un format d'instruction binaire de bas niveau que les navigateurs web modernes peuvent exécuter à une vitesse quasi native. Il est conçu pour être une cible de compilation portable pour des langages de haut niveau comme C, C++ et Rust.

Ainsi, au lieu que le moteur JavaScript d'un navigateur ne comprenne que du JavaScript, il comprend maintenant aussi ce bytecode Wasm super-optimisé et de bas niveau. Cela signifie que vous pouvez prendre une application complexe écrite en C et, avec les bons outils, la compiler en un fichier .wasm qui peut tourner dans un onglet de navigateur.

Compiler CPython en Wasm

C'est là que se produit le déclic. L'interpréteur Python standard le plus utilisé s'appelle CPython parce qu'il est écrit en C. Puisque nous pouvons compiler du code C en WebAssembly, il s'ensuit que nous pouvons compiler l'intégralité de l'interpréteur CPython en WebAssembly.

Ce processus, mené par des projets comme Pyodide, prend le code source C de l'interpréteur Python et le passe dans un compilateur spécial (comme Emscripten). La sortie n'est pas un fichier .exe ou un exécutable classique pour votre OS, mais un fichier cpython.wasm. Ce fichier contient tout l'environnement d'exécution Python : la machinerie pour analyser votre code, gérer la mémoire et exécuter vos instructions, le tout empaqueté dans un format que le navigateur peut exécuter.

Un système de fichiers en mémoire

Lorsque votre navigateur charge cet interpréteur cpython.wasm, ce n'est que ça : l'interpréteur. Il s'exécute dans un bac à sable strict et n'a aucun accès au véritable système de fichiers de votre ordinateur (un énorme gain de sécurité). Alors, comment fonctionnent import numpy ou même import math ? Ces bibliothèques ont besoin que des fichiers existent quelque part.

La solution est un système de fichiers virtuel. Un morceau de la mémoire du navigateur est alloué pour se comporter comme un disque dur. Avant même que le playground n'exécute votre code, il précharge un paquet contenant la bibliothèque standard de Python et d'autres versions Wasm précompilées de paquets populaires (comme NumPy) dans ce système de fichiers en mémoire. Lorsque votre code Python exécuté dans Wasm lance import numpy, l'interpréteur regarde à l'intérieur de ce système de fichiers virtuel, trouve les fichiers nécessaires et les charge, tout comme il le ferait sur votre machine locale.

Faire le pont entre deux mondes : la connexion JS <-> Python

Nous avons donc un interpréteur Python qui tourne en Wasm à l'intérieur du moteur JS du navigateur. Comment y fait-on entrer du code et en sortir des résultats ? Ceci est géré par une couche de liaison ("glue") écrite en JavaScript.

Le flux de travail ressemble à quelque chose comme ça :

  1. Initialisation : Votre navigateur charge la page. Du code JavaScript télécharge l'interpréteur cpython.wasm et le paquet du système de fichiers virtuel.
  2. Passage de relais : Vous tapez votre code Python, par exemple print("Hello from Python!"), dans une zone de texte et cliquez sur "Exécuter".
  3. La liaison : Une fonction JavaScript prend votre code sous forme de chaîne de caractères et le passe à une fonction spéciale exposée par le module Wasm.
  4. Exécution Wasm : À l'intérieur de l'environnement Wasm, l'interpréteur CPython prend vie. Il analyse votre chaîne de code, l'exécute et produit une sortie (dans ce cas, en écrivant "Hello from Python!" sur son flux de sortie standard, stdout).
  5. Capture de la sortie : Le code de liaison JS est conçu pour intercepter tout ce que le module Wasm écrit sur stdout ou stderr et le capture sous forme de chaîne de caractères.
  6. Le retour : Le code JS prend cette chaîne capturée et l'affiche dans la zone de sortie sur la page web. Pour des données plus complexes, la couche de liaison effectue une traduction, convertissant les objets Python comme les dictionnaires et les listes en leurs équivalents JavaScript (dict -> Object, list -> Array).

Ce pont permet aux deux mondes distincts — le DOM du navigateur géré par JavaScript et l'environnement d'exécution Python isolé dans Wasm — de communiquer de manière transparente.

Exemples concrets

L'extrait de code en entretien pour un poste en Data Science

Sarah était au dernier tour d'un entretien technique pour un poste de data scientist. L'intervieweur, partageant son écran, lui dit : « Pourriez-vous écrire rapidement une fonction Python utilisant NumPy pour calculer une moyenne mobile sur trois points d'une liste de nombres ? » Au lieu de s'emmêler les pinceaux avec un éditeur de texte partagé et de dire « eh bien, il faudrait importer NumPy comme ça... », Sarah a demandé le contrôle, a ouvert un playground Python dans le navigateur et a tapé le code. Elle a défini la fonction, créé un tableau d'exemple et l'a exécuté, montrant instantanément le bon résultat. Elle a ensuite partagé le lien vers sa solution fonctionnelle dans le chat. L'intervieweur a été impressionné non seulement par le code correct, mais aussi par la démonstration rapide et pratique.

Leçon : Un playground dans le navigateur est l'environnement autonome parfait pour prouver un concept ou tester un algorithme sans la friction de l'installation locale, ce qui en fait un outil puissant pour le codage en direct et la collaboration.

Le rapport de bogue qui a vraiment aidé

Alex a découvert un bug de cas limite étrange dans une bibliothèque open-source de visualisation de données. Le graphique s'affichait mal uniquement lorsque les données d'entrée étaient une liste de tuples contenant une valeur None. Il a ouvert une "issue" sur GitHub, mais au lieu de simplement décrire le problème, il a ouvert un playground Python. Il a collé le code minimal nécessaire pour reproduire l'erreur — l'instruction d'importation, la structure de données problématique exacte et l'appel de fonction qui a déclenché le bug. Il l'a exécuté, a vu le message d'erreur et a collé le lien du playground dans son rapport de bogue avec le titre « Exemple Minimal Reproductible ». Le mainteneur de la bibliothèque a pu cliquer sur le lien, voir l'erreur instantanément et commencer à déboguer sans aucune installation.

Leçon : Un extrait de code partageable et exécutable est la référence absolue en matière de rapport de bogue. Il élimine l'ambiguïté et réduit considérablement la barrière pour que les autres puissent aider.

Le petit moment « Comment ça marche déjà, ça ? »

Maya, une développeuse front-end, était au milieu d'un composant React complexe. Elle devait passer des données à une API backend qui attendait une structure de dictionnaire Python spécifique. Elle ne se souvenait plus très bien de la syntaxe d'une compréhension de dictionnaire. Au lieu de casser son rythme en ouvrant un terminal, en créant un nouveau fichier et en l'exécutant, elle a simplement ouvert un nouvel onglet de navigateur avec un playground Python. Elle a tapé squares = {x: x*x for x in range(5)} et print(squares), a cliqué sur Exécuter et a eu sa réponse en moins de dix secondes. Elle a récupéré la syntaxe, a fermé l'onglet et est retournée directement à son code JavaScript.

Leçon : Les playgrounds de navigateur sont le moyen le plus rapide de « changer de contexte » et de vérifier la syntaxe ou le comportement dans un autre langage sans perturber votre flux de développement principal.

Erreurs et pièges courants

  • S'attendre à un accès aux fichiers locaux. Vous ne pouvez pas écrire open('C:\\Users\\Me\\my_data.csv', 'r'). Le playground s'exécute dans un bac à sable sécurisé du navigateur et n'a absolument aucun accès aux fichiers de votre ordinateur. Vous devez coller vos données directement dans votre code.
  • Essayer de pip install n'importe quoi. L'environnement est livré avec un ensemble prédéfini et précompilé de paquets populaires. Vous ne pouvez pas installer des paquets arbitraires depuis le Python Package Index (PyPI), en particulier ceux avec des dépendances C complexes qui n'ont pas été compilées pour Wasm.
  • Oublier que c'est une session isolée. Votre code, vos variables et vos modules importés n'existent que pour la durée de vie de la page. Si vous actualisez l'onglet du navigateur, tout est effacé. C'est un environnement sans état (stateless).
  • Exécuter du code bloquant ou des boucles infinies. Un while True: pass d'apparence innocente va monopoliser le thread principal du navigateur et geler tout l'onglet. Le navigateur finira par abandonner et vous demandera de fermer la page. Le playground est fait pour des scripts rapides, pas pour des tâches longues et gourmandes en calculs.
  • Ignorer le coût de démarrage. Bien que l'exécution de Wasm soit rapide, le chargement de l'interpréteur Python et du système de fichiers de plusieurs mégaoctets dans le navigateur prend un instant. La première exécution sur une page fraîchement chargée sera toujours plus lente que les exécutions suivantes.

Pourquoi garder ça sur votre radar

Un playground Python basé sur un navigateur devrait faire partie de la boîte à outils virtuelle de chaque développeur. C'est l'équivalent numérique d'un brouillon pour gribouiller du code.

Pensez-y quand :

  • Vous devez tester un petit algorithme ou une transformation de données sans le cérémonial de la création d'un fichier .py.
  • Vous enseignez ou expliquez un concept Python et souhaitez fournir un exemple live et interactif que quelqu'un peut exécuter et bidouiller.
  • Vous êtes un développeur non-Python qui a besoin de comprendre ou de prototyper un morceau de logique Python d'un collègue.
  • Vous êtes sur une machine verrouillée (comme un Chromebook ou un appareil d'entreprise) sur laquelle vous не pouvez pas installer un environnement Python complet.
  • Vous voulez expérimenter avec une bibliothèque comme NumPy ou Pandas pour une petite tâche sans les tracas de la gestion d'un environnement venv ou conda local.

Cela représente un changement fondamental : amener des calculs sérieux et des écosystèmes de développeurs populaires directement dans la plateforme omniprésente qu'est le navigateur web.

Pour aller plus loin

  • WebAssembly.org — Le site officiel pour tout ce qui concerne Wasm, y compris les spécifications et la documentation.
  • The Pyodide Project — Un projet de premier plan pour la compilation de Python et de la pile scientifique vers WebAssembly. Le moteur derrière de nombreux outils Python en navigateur.
  • MDN WebAssembly Docs — L'excellente documentation de Mozilla, orientée développeur, sur l'utilisation de WebAssembly dans le navigateur.
  • CPython source code — Pour les plus courageux, voici le code source C de l'interpréteur Python lui-même.
  • Emscripten — La chaîne d'outils utilisée pour compiler le code C/C++ en WebAssembly, et un composant clé pour faire entrer CPython dans le navigateur.

Comment un éditeur comprend le code

Les couleurs viennent d’un analyseur de langage, pas de l’exécution du programme. CodeMirror et Lezer reconnaissent les symboles et la structure dans le navigateur. Les suggestions combinent mots-clés, noms locaux lorsque disponibles, extraits et une petite référence intégrée ; survoler un symbole documenté révèle sa signature. Une suggestion ne garantit pas que cette API existe dans le moteur. Les diagnostics repèrent la syntaxe incorrecte lorsque l’analyseur le permet, sans remplacer le contrôle des types ni l’exécution : une syntaxe valide peut encore échouer. Ruby et Lua utilisent des modes fondés sur les tokens, aux diagnostics plus limités. Aucun serveur de langage distant : le code reste sur l’appareil.

CodeMirror & Lezer: MIT.

Théorie bouclée. Place à la pratique — 100 % dans ton navigateur.

Essayer l'outil: Python Playground