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 tout ce que j'ai peut-être négligé):

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.

Veuillez noter: Ce n'est pas une demande pour des recommandations ou des avis. Je cherche des faits objectifs qui informeraient un choix éclairé.

50
demandé sur sean 2015-05-10 22:08:35

8 réponses

Cela pourrait aussi être utile: http://stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html

, Il compare plusieurs Python-dans-le-navigateur technologies.

25
répondu dstromberg 2015-05-28 22:01:19

Voici quelques informations sur Brython vs Transcrypt (juillet 2016, puisque Transcrypt a été ajouté en option sur cette question par L'OP), glanées en démarrant un projet avec Brython il y a quelques mois et en passant à Transcrypt (terminé la semaine dernière). J'aime Brython et Transcrypt et peut voir les utilisations pour les deux.

Pour les personnes qui sont nouvelles, Brython et Transcrypt les deux entrées Python 'transpile' à javascript (Edit :peut-être vaut-il mieux voir Brython comme une ' implémentation Python pour le navigateur ' car il ne produit pas de javascript autonome). Les deux nécessitent une syntaxe Python 3. Brython inclut un nombre important de bibliothèques standard Python et certaines d'entre elles sont propres à traiter des choses liées au web, alors que Transcrypt évite cela pour la plupart et suggère d'utiliser des bibliothèques Javascript à la place.

Brython (Github) peuvent faire la conversion dans le navigateur. Donc, vous écrivez en python et le brython.js moteur convertit en javascript à la volée lorsque la page est chargée. Ceci est vraiment pratique, et est beaucoup plus rapide que vous pourriez penser. Cependant, le brython.js moteur que vous devez inclure dans vos pages est d'environ 500 ko. En outre, il y a la question de l'importation de bibliothèques standard, que Brython gère en récupérant separate .fichiers js avec des requêtes XHR. Certaines bibliothèques sont déjà compilées dans brython.js, donc pas chaque importation de tirer de nouveaux fichiers, mais si vous utilisez de nombreuses importations, les choses peuvent devenir lent. 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 lorsque la page a été chargée, puis supprimer tous les fichiers que mon projet n'utilisait pas dans une copie du dossier Brython src, et exécuter le script inclus avec Brython (je pense que c'est à Brython/www/scripts/make_VFS.py) qui compile toutes les bibliothèques disponibles dans un fichier appelé py_VFS.js que vous devez également lier à partir de votre html. Normalement, il fera un énorme fichier 2MB+, mais si vous supprimez les choses que vous n'êtes pas en utilisant, il peut être assez minuscule. Faire de cette façon, signifie que vous avez seulement besoin de tirer brython.js, py_VFS.js et votre code python, et aucune requête XHR supplémentaire ne sera nécessaire.

Transcrypt (Github ) d'autre part, est distribué comme un paquet python 3 que vous pouvez utiliser manuellement, ou accrocher dans votre chaîne d'outils, pour compiler python en javascript à l'avance. Donc, avec Transcrypt, vous écrivez en python, exécutez transcrypt contre le python et il crache javascript que vous pouvez lier dans votre projet. C'est plus comme un compilateur traditionnel aussi en ce qu'il offre un certain contrôle sur la sortie. Par exemple, vous pouvez choisir de compiler en ES6 ou ES5, ou lui demander de sortir des sourcemaps (que pendant le débogage, le navigateur vous amène directement au code Python correspondant, insead du code javascript généré.) La sortie javascript de Transcrypt est assez laconique (ou autrement dit, c'est joli et laconique). Dans mon cas 150kB de python est converti en 165kB de unminified ES5 javascript. À titre de comparaison, la version Brython de mon projet a utilisé environ 800Kb après la conversion.

Cependant, obtenir les avantages de Transcrypts terseness, nécessite de lire les docs un peu (vraiment juste 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 son activation globale est déconseillée en raison de problèmes de performances potentiels liés à la vérification de type. Pour plus de clarté: sous CPython, un empty dict, set ou list a la valeur truth False, alors qu'en Javascript il est considéré comme 'true'.. 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'indicateur-t lors de la conversion de python en javascript, par exemple: $ transcrypt-t python.py (non recommandé, mais ce n'est probablement pas un problème sauf si vous vérifiez la véracité plusieurs fois dans les boucles internes du code sensible aux performances..)
  • Utiliser __pragma__(tconv) ou __pragma__(notconv) dans votre code pour indiquer la transcrypt compilateur activez la conversion automatique en valeurs de vérité de type python localement.
  • au lieu de vérifier la valeur de vérité, évitez complètement le problème en vérifiant simplement len(myList) > 0... Peut-être que ce sera bien pour la plupart des situations, fait le travail pour mon utilisation légère.

Bon, donc mon projet devenait plus grand et je voulais pré-compiler pour un gain de performance mais j'ai trouvé difficile de le faire avec Brython (bien que ce soit techniquement possible, un moyen facile d'utiliser le en ligne editor et cliquez sur le bouton javascript pour voir la sortie). Je l'ai fait et lié au javascript généré à partir du projet.html mais cela n'a pas fonctionné pour une raison quelconque. En outre, 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 sorti et la taille du moteur brython commençaient à me déranger. J'ai donc décidé de regarder de plus près Transcrypt, qui avait d'abord semblé être de qualité supérieure parce que je préférez les instructions abasourdies qui me disent comment commencer immédiatement (celles-ci ont depuis été ajoutées).

La principale chose à configurer après l'installation de Python3. 5 était 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 foldername- solution de contournement pour ubuntu avec des problèmes de package pour 3.5). Cela rend 'foldername' avec un sous-dossier bin entre autres choses. 2) installez le paquet Transcrypt python avec pip ('foldername/bin / pip install transcrypt') qui l'installe dans foldername / lib / python3. 5 / site-packages / transcrypt. 3) 'activer' le terminal actuel si vous ne voulez pas avoir à taper le chemin complet vers foldername/bin/python3.5 à chaque fois. Activez en tapant :' source foldername / 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'ai utilisé nomdossier/www/projet. Donc CD dans ce dossier et exécutez: 'transcrypt-b your_python_script.py'. cela place la sortie dans un sous-dossier appelé __javascript__. Vous pouvez ensuite créer un lien vers le javascript sorti à partir de votre code html.

Principales questions se déplaçant à travers les

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

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

    __pragma__ ('js', '{}', ''' // javascript code ''')

  • Les fonctions spécifiques au html de Brython ne fonctionnent évidemment pas avec Transcrypt. Il suffit d'utiliser les moyens JavaScript normaux. Exemples: 1) sous Brython, vous avez peut-être fait référence à une balise HTML spécifique en utilisant ' document ['id']' , mais avec Transcrypt, vous utiliseriez "document.getElementById('id') (qui est de la même manière que vous le faites à partir de javascript). 2) vous ne pouvez pas supprimer un nœud avec 'del nodeName' (bcs c'est une fonction brython). Utiliser quelque chose comme " nœud.parentNode.removeChild(nœud)'. 3) remplacez toutes les fonctions DOM de brython par les alternatives javascript. par exemple, class_name = className; texte = textContent; html = innerHTML; parent = parentNode; enfants = childNodes etc. Je suppose que si vous avez besoin de quelque chose qui contient des alternatives requises par certains navigateurs plus anciens ensuite, il y a des bibliothèques javascript pour cela. 4) Set_timeout de Brython est remplacé par JavaScript setTimeout 5) les balises html de Brython telles que BR () doivent être remplacées en utilisant les méthodes javascript normales ainsi que de refaire tous les endroits que vous avez utilisés c'est la syntaxe de manipulation

  • J'ai fini de déplacer un projet de ligne 2700 la semaine dernière, à laquelle Transcrypt N'avait pas de support pour quelques petites choses (bien qu'elles soient assez faciles à remplacer par des charges), c'était 1) str.plus bas, str.split (str.split est présent, mais semble être le split javascript, qui fonctionne différemment de la version python, dont je comptais sur le comportement), 2) round (cela semble être pris en charge dans la version dev maintenant) et 3) isinstance n'a pas fonctionné sur str, int et float, seulement sur dict, list et set. 4) une autre différence de Brython que j'ai remarqué est que si je tire dans une représentation JSON d'un dict, je dois le faire en utilisant ' myDict = dict (data)', alors que brython était heureux avec'myDict = data'. Mais cela pourrait être lié à quelque chose dans le json de Brython.charges, que j'ai remplacé directement avec JSON.analyser. 5) également sans surcharge de l'opérateur Transcrypts spécifiquement activé (en utilisant le commutateur-o pour global, ou __pragma__('opov') Pour local), vous impossible de faire des choses comme définir des opérations en utilisant le format surchargé, mais besoin d'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) en outre, vous ne pouvez pas itérer les dicts par défaut en utilisant ' for I in dict:', sans activer cela (cmd line-i ou __pragma__('iconv'), mais vous pouvez éviter d'avoir à l'activer en utilisant simplement le membre keys() par exemple:

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

Pour résumer

  • J'aime Brython parce qu'il est facile d'y aller et de tester votre code (juste F5). C'est plus proche du vrai python parce que la plupart de la lib standard est là. Je n'aime pas avoir à inclure le moteur de transpilation (Edit: ou on pourrait le voir comme une machine virtuelle python) dans le navigateur et la grande taille javascript sortie. Si je devais faire des choses (mais toujours en utilisant Brython), j'aurais utilisé des méthodes javascript pour manipuler le DOM de brython (ce que vous pouvez faire..), au lieu de se pencher tant sur les méthodes brython parce que cela a perdu du temps à passer à un autre transpiler quand mes besoins modifié.

  • J'aime Transcrypt parce que le javascript sorti est vraiment "maigre et méchant" et parce que la seule chose que vous chargez du côté du navigateur est votre code javascript généré qui est de taille similaire à votre code python. Aussi parce qu'il prend en charge sourcemaps et parce qu'il me donne une mesure de contrôle sur le javascript sorti. Et l'utiliser m'a appris un peu sur l'optimisation.

J'espère que cela aide quelqu'un à voir lequel d'entre eux pourrait être bon pour leur projet particulier.

45
répondu fzzylogic 2017-02-16 00:33:12

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 comme un gagnant clair.

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

Peut-être que les gens sont trop hâtifs?

10
répondu P i 2015-05-10 19:20:10

J'ai utilisé et engagé skulpt ainsi que pypyjs. Et ils sont tous les trois très différents que toute comparaison est sans objet 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 toute la machine virtuelle PyPy. Donc, si vous voulez que l'implémentation de python soit complète, c'est votre bébé. Il a un pont javascript qui fonctionne vraiment bien mais ce n'est pas une option viable pour ecrire votre code de site Web javascript en python. Il vous laissera cependant import compiler.

Il est construit avec emscripten et est plus rapide puis CPython, en exécutant le benchmark pystone.

J'ai donné un bref exposé sur pypyjs Voici les diapositives.

Skulpt

Est un outil d'enseignement (ou il a évolué au fil du temps), il compile votre Python dans une machine d'état émulant très étroitement le compilateur cpython. Au cœur c'est une implémentation manuscrite de le 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 supporte les continuations asynchrones, il vous permet de suspendre l'exécution de python pendant qu'il résout une chose 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 moins sur celui-ci peut-être @ 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 benchmark pystone parce que le temps.l'horloge n'est pas implémentée, car officiellement c'est une fonction matérielle.

10
répondu albertjan 2015-10-20 08:10:08

Tout d'abord, je suis un committer Brython . Néanmoins, je vais essayer d'être aussi impartial que possible pour faire une évaluation objective .

La dernière fois que je l'ai utilisé, Skulpt ne supportait pas des fonctionnalités telles que les expressions du générateur . Brython et PyPy.js le font, donc au niveau des fonctionnalités à mon humble avis, les derniers sont supérieurs .

Brython (en ce moment) est toujours en cours . Certains modules ne peuvent pas être importés (par exemple xml.ElementTree ). Néanmoins cette situation commence de changement puisque nous travaillons à l'exécution de toute la suite de tests CPython en dépit de la compatibilité totale avec les normes (au moins quand cela a du sens) .

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ée,...) mais je ne suis pas sûr de savoir si cela convient à l'exécution dans le navigateur . Cela pourrait changer à mesure que le projet évoluer .

TODO: je vais essayer de compléter ma réponse avec des benchmarks fiables .

6
répondu Olemis Lang 2015-08-07 19:43:52

Pas mentionné ici est RapydScript ou RapydScript-NG. Ils produisent un code JavaScript très efficace, qui est utilisé dans GlowScript VPython (glowscript.org). j'avais l'habitude d'utiliser le RapydScript original D'Alex Tsepkov ( https://github.com/atsepkov/RapydScript ) mais récemment passé à RapydScript-NG de Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ). j'ai récemment couru le benchmark pystone sur CPython, RapydScript et Brython, et vous pouvez voir les résultats ici:

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

5
répondu user1114907 2017-01-07 17:38:23

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

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, il dépendra de ce que vous essayez de faire. J'ai choisi Transcrypt après avoir regardé parce que c'était plus pragmatique et plus performant, aussi plus récemment libéré / maintenu.

4
répondu icarito 2016-10-19 16:02:03

Ceci est une conférence mise à jour qui compare toutes les options disponibles sur le marché en ce moment:

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

L'orateur est Russell Keith-Magee, qui est un développeur bien connu dans la région.

1
répondu Daian Gan 2018-08-27 16:01:34