web-dev-qa-db-fra.com

Python dans le navigateur: Comment choisir entre Brython, PyPy.js, Skulpt et Transcrypt?

Je suis très heureux de voir qu'il est maintenant possible de coder Python dans le navigateur. Ce sont les principaux candidats (veuillez ajouter ceux que j'ai peut-être oubliés):

Mais comment choisir entre eux? La seule différence évidente que je peux voir est que Skulpt est basé sur Python 2, alors que Brython est basé sur Python 3.

Remarque: Il ne s'agit pas d'une demande de recommandations ou d'opinions. Je cherche des faits objectifs qui éclaireraient un choix éclairé.

66
P i

Voici quelques informations sur Brython vs Transcrypt (juillet 2016, puisque l'OP a ajouté Transcrypt à cette question), glanées en lançant un projet avec Brython il y a quelques mois et en passant à Transcrypt (finalisée la semaine dernière). J'aime Brython et Transcrypt et je peux en voir les utilisations à la fois.

Pour les débutants, Brython et Transcrypt "transpilent" python entrée en javascript (Edit: Peut-être vaut-il mieux voir Brython comme un 'a Python = implémentation pour le navigateur 'car il ne produit pas de javascript autonome. Les deux nécessitent la syntaxe Python 3. Brython inclut un nombre substantiel de Python et certaines d'entre elles sont propres à la gestion de problèmes liés au Web, alors que Transcrypt les évite pour la plupart et suggère d'utiliser plutôt des bibliothèques Javascript.

Brython ( Github ) peut effectuer la conversion dans le navigateur. Donc, vous écrivez python et le moteur brython.js le convertit en javascript à la volée lorsque la page est chargée. C’est très pratique et beaucoup plus rapide que vous ne le pensez. Le moteur brython.js que vous devez inclure dans vos pages représente environ 500 Ko. Il faut également importer des bibliothèques standard, que Brython gère en récupérant des fichiers .js séparés avec des requêtes XHR. Certaines bibliothèques sont déjà compilées dans brython.js. Chaque importation n'entraînera pas de nouveaux fichiers, mais si vous utilisez beaucoup d'importations, les choses peuvent devenir lentes. Cependant, il existe des moyens de contourner ce problème. Ce que j'ai fait était de vérifier l'onglet Réseau dans les outils de développement du navigateur pour voir quels fichiers étaient extraits. Une fois la page chargée, supprimez tous les fichiers que mon projet n'utilisait pas dans une copie du dossier Brython src, puis exécutez le script fourni avec Brython (je crois que c'est dans Brython/www/scripts/make_VFS.py) qui est compilé. toutes les bibliothèques disponibles dans un fichier nommé py_VFS.js que vous devez également associer à partir de votre ht ml. Normalement, cela fera un énorme fichier de 2 Mo +, mais si vous supprimez ce que vous n'utilisez pas, il peut être très petit. Le faire de cette façon signifie que vous devez uniquement extraire brython.js, py_VFS.js et votre code python), et aucune demande XHR supplémentaire ne sera nécessaire.

Transcrypt ( Github ) d'autre part, est distribué sous la forme d'un paquet python que vous pouvez utiliser manuellement ou raccorder à votre chaîne d'outils pour compilez python en javascript. À l’avance avec Transcrypt, vous écrivez en python, exécutez transcrypt sur le python et javascript que vous pouvez créer un lien vers votre projet.Il ressemble plus à un compilateur traditionnel également en ce qu’il offre un certain contrôle sur la sortie. Par exemple, vous pouvez choisir de compiler vers ES6 ou ES5, ou de lui demander de générer des cartes sources (lors du débogage, le navigateur vous emmène directement vers le code correspondant python, au lieu du code javascript généré.) La sortie javascript de Transcrypt est plutôt succincte (ou en d'autres termes, elle est jolie et concise). Dans mon cas, 150 Ko de python est converti en un fichier javascript ES5 non modifié de 165 Ko. À titre de comparaison, la version Brython de mon projet utilisait environ 800 Ko après la conversion.

Cependant, pour tirer parti des avantages de la rigueur de Transcrypts, il est nécessaire de lire un peu la documentation (vraiment un peu). Par exemple, avec Transcrypt, la "véracité" de Python pour les structures de données telles que dict, set et list n'est pas activée par défaut et est globalement déconseillée en raison de problèmes de performances potentiels liés au contrôle typographique. Pour plus de clarté: Sous CPython, un dict, un ensemble ou une liste vide a la valeur de vérité False, alors qu'en Javascript, il est considéré comme "vrai". Exemple:

myList = []
if myList:    # False in CPython bcs it's empty, true in javascript bcs it exists
    # do some things.

Il y a au moins trois façons de résoudre ce problème:

  • Utilisez l’option -t lors de la conversion python en javascript, par exemple: $ transcrypt -t python.py (non recommandé, mais ce n’est probablement pas un problème si vous ne vérifiez pas la véracité plusieurs fois dans les boucles intérieures de). code sensible aux performances ..)
  • Utilisez __pragma__(tconv) ou __pragma__(notconv) dans votre code pour indiquer au compilateur de transcryptage d'activer la conversion automatique en valeurs de vérité ressemblant à python localement.
  • Au lieu de vérifier la valeur de vérité, évitez le problème en cochant simplement len ​​(myList)> 0 ... Peut-être que cela ira dans la plupart des situations, fait le travail pour mon utilisation légère.

Donc, mon projet grandissait et je voulais pré-compiler pour obtenir un gain de performance, mais j’ai eu du mal à le faire avec Brython (même s’il est techniquement possible, un moyen simple étant d’utiliser éditeur en ligne et cliquez sur le bouton javascript pour voir la sortie). Je l'ai fait et lié au javascript généré à partir de project.html mais cela n'a pas fonctionné pour une raison quelconque. De plus, j'ai du mal à comprendre les messages d'erreur de Brython, donc je ne savais pas par où commencer, après l'échec de cette étape. En outre, la grande taille du code généré et la taille du moteur de Brython commençaient à m'embêter. J’ai donc décidé d’examiner de plus près Transcrypt, qui, au début, semblait être de meilleure qualité, car je préfère les instructions muettes qui me disent comment commencer immédiatement (elles ont été ajoutées depuis).

La principale chose à faire après l’installation de Python3.5 a été:

  1. Utilisez venv (c'est comme une nouvelle version intégrée de virtualenv qui utilise moins d'espace pour chaque projet) pour configurer un dossier de projet python3.5 (tapez simplement: python3.5 -m venv nom_dossier - solution de contournement pour Ubuntu avec problèmes de paquet pour 3.5 ). Cela donne "nom de pli" avec un sous-dossier bin entre autres.
  2. Installez Transcrypt python avec pip ('nomdossier/bin/pip install transcrypt')) qui l’installe sous le nom de pli/lib/python3.5/site-packages/transcrypt.
  3. activate le terminal actuel si vous ne voulez pas avoir à taper le chemin complet du nom de pli/bin/python3.5 à chaque fois. Activer en tapant: 'nom de dossier source/bin/activate'
  4. Commencez à écrire du code et à le compiler en javascript pour le tester. Compilez à partir du dossier dans lequel vous écrivez votre code. Par exemple, j’utilisais foldername/www/project. Alors CD dans ce dossier et exécutez: 'transcryptez -b votre_python_script.py'. Cela place la sortie dans un sous-dossier appelé __javascript__. Vous pouvez ensuite créer un lien vers le code JavaScript généré à partir de votre code HTML.

Principaux problèmes rencontrés

J'ai des besoins assez simples, donc votre kilométrage peut varier.

  • Vous devez remplacer brython ou python libs standard avec libs javascript. Ainsi, par exemple, "import json" est fourni par Brython, mais sous Transcrypt, vous pouvez utiliser une lib javascript ou simplement JSON.parse/JSON.stringify directement dans votre code Python. Pour inclure une version simplifiée d'une bibliothèque javascript directement dans votre code python, utilisez les guillemets triples) :

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
    
  • Les fonctions spécifiques à HTML de Brython ne fonctionnent évidemment pas avec Transcrypt. Utilisez simplement les méthodes javascript normales. Exemples: 1) sous Brython, vous avez peut-être référé à une balise HTML spécifique en utilisant 'document [' id ']', mais avec Transcrypt, vous utilisiez 'document.getElementById (' id ') (comme vous le feriez avec de javascript). 2) Vous ne pouvez pas supprimer un nœud avec 'del nodeName' (bcs qui est une fonction brython). Utilisez quelque chose comme 'node.parentNode.removeChild (node)'. 3) remplacez toutes les fonctions DOM de brython par les alternatives javascript. par exemple. nom_classe = nomClasse; text = textContent; html = innerHTML; parent = parentNode; children = childNodes etc. Je suppose que si vous avez besoin de quelque chose qui contienne des alternatives requises par certains navigateurs plus anciens, il existe des bibliothèques javascript pour cela. 4) Le set_timeout de Brython est remplacé par des javascripts setTimeout 5) Les balises html de Brython telles que BR () doivent être remplacées à l'aide des méthodes javascript normales, ainsi que pour refaire tous les endroits où vous avez utilisé la syntaxe <= dom. Vous pouvez soit injecter du texte en clair en tant que innerHTML, soit créer les éléments à l'aide de la syntaxe javascript, puis les attacher à l'aide de la syntaxe DOM javascript normale. J'ai aussi remarqué que pour les cases à cocher, brython utilise "if checkbox = 'selected':" mais Transcrypt est satisfait de "if checkbox:" ..

  • J'ai fini de déplacer un projet de 2700 lignes sur la semaine dernière et à ce moment-là, Transcrypt ne prenait en charge que quelques tâches mineures (bien qu'elles soient assez faciles à remplacer par des charges), il s'agissait de 1) str.lower, str.split (str. split est présent, mais semble être le split javascript, qui fonctionne différemment de la version python, dont je m'appuyais), 2) round (cela semble être pris en charge dans le version dev maintenant) et 3) isinstance ne fonctionnait pas sur str, int et float, mais uniquement sur dict, list et set. 4) Une autre différence par rapport à Brython que j'ai remarquée est que si j'insère une représentation JSON d'un dict, je dois le faire avec 'myDict = dict (data)', alors que brython était satisfait de 'myDict = data'. Mais cela pourrait être lié à quelque chose dans json.loads de Brython, que j'ai directement remplacé par JSON.parse. 5) De plus, sans la surcharge d'opérateur Transcrypts spécifiquement activée (en utilisant le commutateur -o pour le global ou __pragma__('opov') pour le local), vous ne pouvez pas faire des choses comme définir des opérations en utilisant le format surchargé, mais vous devez utiliser les fonctions correspondantes. . Par exemple.

    a = set([1, 2, 3])
    b = set([3, 4, 5])
    a.difference(b)             # is used instead of a - b
    a.union(b)                  # used instead of a | b
    a.intersection(b)           # used instead of a & b
    a.symmetric_difference(b)   # used instead of a ^ b
    

6) De plus, vous ne pouvez pas itérer les dict par défaut avec 'for i in dict:', sans l'activer (cmd line -i ou __pragma__('iconv'), mais vous pouvez éviter de l'activer en utilisant simplement le touches () membre par exemple:

for key, value in dict.items():
    # do things for each key and value..

Pour résumer

  • J'aime Brython car il est facile d'y aller et de tester votre code (seulement F5). C'est plus proche de true python car la plupart des libs standard sont là. Je n'aime pas avoir à inclure le moteur de transpilation (Edit: On peut le voir comme python = VM) dans le navigateur et la grande taille javascript sortie. Si je devais faire plus de choses (mais toujours en utilisant Brython), j’aurais utilisé des méthodes javascript pour manipuler le DOM depuis brython (ce que vous pouvez faire ..), au lieu de Je me suis tellement appuyé sur les méthodes Brython parce que cela a fait perdre du temps à passer à un autre transpiler lorsque mes besoins ont changé.

  • J'aime Transcrypt parce que le javascript généré est vraiment "maigre et mesquin" et parce que la seule chose que vous chargez du côté du navigateur est votre code javascript généré dont la taille est similaire à celle de votre python. Aussi parce que supporte les sourcescemaps et parce que cela me donne une mesure de contrôle sur le javascript généré et son utilisation m'a appris pas mal d'optimisation.

J'espère que cela aidera quelqu'un à voir lequel de ces éléments pourrait être bon pour son projet particulier.

54
fzzylogic

J'ai utilisé et engagé à skulpt ainsi que pypyjs. Et ils sont tous les trois très différents que toute comparaison est discutable si vous me demandez.

Cela dépend de ce que vous recherchez qui aura le plus de sens.

PyPyJS

pypyjs est énorme, c'est un fichier javascript de 12 Mo qui contient la totalité de la machine virtuelle pypy. Donc, si vous voulez python la mise en œuvre complète, ceci est votre bébé. Il a un pont javascript qui fonctionne vraiment bien mais ce n’est pas une option viable pour écrire le code de votre site web javascript en python. Il vous laissera cependant import compiler.

Il est construit avec emscripten et est plus rapide que CPython, dans l'exécution du test pystone.

J'ai parlé brièvement de pypyjs ici sont les diapositives.

Skulpt

Est un outil pédagogique (ou il en a évolué avec le temps), il compile votre python dans une machine à états émulant de très près le compilateur cpython. À la base, il s'agit d'une implémentation manuscrite du compilateur python en javascript. Il permet une exécution asynchrone qui vous permet de faire:

while (True):
    print "hi"

Sans verrouiller le navigateur.

Skulpt est le seul qui prend en charge les continuations asynchrones. Il vous permet de suspendre l'exécution de python tout en résolvant quelque chose d'asynchrone. Faire ce travail:

from time import sleep
sleep(1)

Skulpt fonctionne à environ un dixième de la vitesse de CPython, en comparant pystone.

Brython

Je sais le moins sur celui-ci peut-être que @ olemis-lang peut développer celui-ci. Mais à côté de la différence évidente que Brython est py3 et les autres py2. Brython est aussi un transpiler.

Brython n'exécute pas le test pystone car time.clock n'est pas implémenté, car il s'agit officiellement d'une fonction matérielle.

12
albertjan

https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/

Cette page compare les trois candidats. Brython apparaît clairement vainqueur.

Malgré l'aide, expliquant que S.O. n’est pas bon pour ce genre de question, il apparaît qu’une réponse concise est dans ce cas possible.

Peut-être que les gens sont trop pressés?

10
P i

Tout d'abord, je suis un committer de Brython. Néanmoins, je vais essayer d'être aussi impartial que possible afin de pouvoir procéder à une évaluation objective.

La dernière fois que je l’ai utilisé, Skulpt ne prenait pas en charge des fonctionnalités telles que les expressions de générateur. Brython et PyPy.js le font, donc au niveau des fonctionnalités, les IMHO sont supérieurs.

Brython (pour le moment) est toujours en cours de développement. Certains modules ne peuvent pas être importés (par exemple, xml.ElementTree ). Néanmoins, la situation commence à changer car nous travaillons à l'exécution de la suite de tests CPython dans son ensemble, en dépit d'une compatibilité totale avec les normes (du moins lorsque cela se justifie).

Brython prend également en charge .vfs.js pour accélérer les importations de modules.

PyPy.js a un certain nombre de caractéristiques qui découlent directement du fait qu’il soit alimenté par PyPy (compilation JIT, bien testé, ...) mais je ne suis pas sûr de savoir si cela est approprié pour une utilisation dans le navigateur. Cela pourrait changer à mesure que le projet évolue.

TODO: Je vais essayer de compléter ma réponse avec des points de repère fiables.

6
Olemis Lang

RapydScript ou RapydScript-NG ne sont pas mentionnés ici. Ils produisent un code JavaScript très efficace, utilisé dans GlowScript VPython (glowscript.org). J'avais l'habitude d'utiliser le RapydScript original de Alex Tsepkov ( https://github.com/atsepkov/RapydScript ), mais j'ai récemment basculé sur RapydScript-NG de Kovid Goyal ( https: // github .com/kovidgoyal/rapydscript-ng ). J'ai récemment exécuté le test de performance pystone sur CPython, RapydScript et Brython, et vous pouvez voir les résultats ici:

https://groups.google.com/forum/?fromgroups&hl=fr#!topic/brython/20hAC9L3ayE

5
user1114907

Comme personne ne l’a mentionné, j’ai pensé que cela valait la peine de mentionner Batavia qui implémente la Python machine virtuelle pour exécuter précompilé Python bytecode .

Je viens de l'essayer et, bien que ce soit un concept intéressant, il en est encore à ses débuts car il y a peu de documentation.

En fin de compte, cela dépendra de ce que vous essayez de faire. J'ai choisi Transcrypt après avoir jeté un coup d'œil car il était plus pragmatique et plus performant, également plus récemment publié/maintenu.

4
icarito

Il s'agit d'une conférence mise à jour qui compare toutes les options disponibles sur le marché à l'heure actuelle:

https://www.youtube.com/watch?v=2XSeNQyPlTY

Le conférencier est Russell Keith-Magee, un développeur bien connu dans la région.

2
Daian Gan