=====pyodide===== ====Présentation==== C'est tout le code javascript généré depuis le runtime python. [[https://github.com/iodide-project/pyodide|Site github]] {{ :lang:python:wasm:pyodide-build-0.16.1.tar.bz2 |Archive v0.16.1}} [[https://pyodide.readthedocs.io|Documentation]] Attention, c'est encore un projet dont la viabilité n'est pas encore sûre. ====Exemple d'application==== L'archive pyodide contient tous les fichiers javascript (''*.js'') et webassembly (''*.data''). On voit que certaines dépendances sont énormes (''scipy'' : 170 Mo) et peuvent clairement être rédhibitoires pour une utilisation en ligne. Les fichiers javascript de pyodide doivent être chargés via le protocole ''%%http://%%'' et non pas via ''%%file://%%''. Il faut donc charger le fichier index.html via une adresse de type ''%%localhost://.../index.html%%'' plutôt que ''%%file:///C:/.../index.html%%''. Sous Windows, l'utilisation de [[prog:wamp|WampServer]] est parfaite pour installer rapidement un serveur apache. Le principe est simple : * On copie le contenu de l'archive pyodide afin d'elle soit accessible via l'URL : [[http://localhost/pyodide/pyodide.js]]. Il faut bien mettre toute l'archive, y compris les fichiers ''.data''. * On initialise le chargement de la librairie : * Puis, on charge les paquets systèmes (compilés en webassembly) dont on a besoin, soit juste avec le nom, soit avec son URL complet : * Enfin, on charge dans le système de fichiers interne au navigateur les modules python. Pour cela, on exécute un programme python qui va créer un fichier contenant le module python (ici : ''angle.py''). Exemple complet : function loadPyModule(module, callback) { xmlHttp = new XMLHttpRequest(); xmlHttp.open( 'GET', '/' + module + '.py', true ); xmlHttp.overrideMimeType("text/plain; charset=x-user-defined"); xmlHttp.onload = function() { document.source = this.responseText document.module = module // Enregistre le fichier dans le système de fichier du runtime Python. pyodide.runPython(` import js import sys sys.path.insert(0, '/') print ("python" + js.document.module + ".py") with open(js.document.module + ".py", "w") as fd: fd.write(js.document.source) `); // Nécessaire pour le moment. // Je n'arrive pas à importer un module ultérieurement. pyodide.runPython(` import ` + module + ` `); callback(); } xmlHttp.send(''); } function loadPyModules(modules, callback, finalCallback, i = 0) { if (Object.is(modules.length - 1, i)) { loadPyModule(modules[i], finalCallback) } else { loadPyModule(modules[i], () => { callback(modules[i]) loadPyModules(modules, callback, finalCallback, i + 1); }) } }