Python im Browser: Wie wähle man zwischen Brython, PyPy.js, Skulpt und Transcrypt?

Ich bin sehr aufgeregt zu sehen, dass es jetzt möglich ist, Python im Browser zu codieren. Dies sind die Hauptkandidaten (bitte addiere ich, was ich übersehen habe):

  • Brython
  • Skulpt
  • PyPy.js
  • Transcrypt

Aber wie kann man zwischen ihnen wählen? Der einzige offensichtliche Unterschied, den ich sehen kann ist, dass Skulpt auf Python 2 basiert, während Brython auf Python 3 basiert.

  • Beste Weg, um Python und JavaScript zu integrieren?
  • Bitte beachten Sie: Dies ist keine Anfrage für Empfehlungen oder Meinungen. Ich suche objektive Tatsachen, die eine gebildete Wahl informieren würden.

  • Lokaler Umfang, über den Umfang der Umschließung hinaus
  • Was macht die Lambda-Funktion?
  • Pythonverschluss funktioniert nicht wie erwartet
  • Wie verstehe ich die Schließung in einem Lambda?
  • Automatische Bindung von Bereichsvariablen in einer Schließung
  • Pythonverschlüsse und Zellen (geschlossene Werte)
  • 7 Solutions collect form web for “Python im Browser: Wie wähle man zwischen Brython, PyPy.js, Skulpt und Transcrypt?”

    Dies könnte auch hilfreich sein: http://stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html

    Es vergleicht mehrere Python-in-the-Browser-Technologien.

    Hier ist ein paar Infos über Brython vs Transcrypt (Juli 2016, seit Transcrypt als Option auf diese Frage von der OP hinzugefügt wurde), die von einem Projekt mit Brython vor ein paar Monaten begonnen und in Transcrypt (abgeschlossene letzte Woche) verschoben wurde. Ich mag Brython und Transcrypt und sehe Gebrauch für beide von ihnen.

    Für Leute, die neu sind, Brython und Transcrypt beide 'transpile' Python-Eingabe in Javascript (Bearbeiten: vielleicht ist es besser, Brython als eine "Python-Implementierung für den Browser" zu sehen, weil es nicht eigenständiges Javascript produziert). Beide benötigen Python 3 Syntax. Brython enthält eine beträchtliche Anzahl von Python-Standardbibliotheken und einige davon ist für den Umgang mit Web-bezogenen Dingen, während Transcrypt das zum größten Teil vermeidet und stattdessen die Verwendung von Javascript-Bibliotheken vorschlägt.

    Brython ( Github ) kann die Konvertierung im Browser durchführen. Also schreibst du in python und der brython.js-Motor wandelt es in Javascript on the fly, wenn die Seite geladen ist. Das ist wirklich bequem und ist viel schneller als man denkt. Allerdings ist die brython.js-Engine, die Sie in Ihre Seiten aufnehmen müssen, etwa 500Kb. Auch gibt es die Frage der Import von Standard-Bibliotheken, die Brython Handles durch Abrufen von separaten .js Dateien mit XHR Anfragen. Einige libs sind bereits in brython.js kompiliert, also wird nicht jeder import in neue dateien ziehen, aber wenn man viele importiert, kann man sich langsam entwickeln Allerdings gibt es hierher noch Was ich tat, war, die Netzwerk-Tab in Browser-dev-Tools zu sehen, welche Dateien wurden eingezogen, wenn die Seite geladen wurde, dann löschen Sie alle Dateien, die mein Projekt nicht in einer Kopie des Brython src Ordner verwendet wurde, und führen Sie die Skript mit Brython enthalten (ich denke, es ist bei Brython / www / scripts / make_VFS.py), die alle verfügbaren libs in eine Datei mit dem Namen py_VFS.js kompiliert, die du auch von deinem html verlinken musst. Normalerweise wird es eine riesige 2MB + Datei machen, aber wenn du die Dinge löschst, die du nicht benutzt hast, kann es ziemlich klein sein. Es ist so, dass du nur brython.js, py_VFS.js und deinen Python-Code anziehen musst und keine zusätzlichen XHR-Anfragen nötig sind.

    Transcrypt ( Github ) auf der anderen Seite, wird als ein Python-3-Paket verteilt , das man manuell verwenden oder in Ihre Toolchain einhängen kann, um Python zu Javascript im Voraus zu kompilieren. Also mit Transcrypt, schreibst du in Python, laufe transcrypt gegen die Python und es spuckt Javascript aus, das du in deinem Projekt verknüpfen kannst. Es ist eher wie ein traditioneller Compiler auch darin, dass es eine gewisse Kontrolle über die Ausgabe bietet. Zum Beispiel können Sie wählen, um ES6 oder ES5 zu kompilieren, oder fragen Sie es, um Sourcemaps (die während des Debuggens lassen Sie uns den Browser nehmen Sie direkt an den entsprechenden Python-Code, Insead des generierten Javascript-Code.) Transcrypt's Javascript-Ausgabe ist ziemlich knapp ( Oder einen anderen Weg, es ist hübsch und knapp). In meinem Fall 150kB Python wird in 165kB von unminified ES5 Javascript umgewandelt. Zum Vergleich, die Brython-Version meines Projekts verwendet etwa 800Kb nach der Umwandlung.

    Allerdings, die Vorteile der Transcrypts Terseness, erfordert das Lesen der Docs ein bisschen (wirklich nur ein bisschen). Zum Beispiel, mit Transcrypt, Python 'Wahrheit' für Datenstrukturen wie dict, set und list ist nicht standardmäßig aktiviert und global ermöglicht es ist entmutigt wegen der potenziellen Performance-Fragen im Zusammenhang mit Typchecking. Für Klarheit: Unter CPython, ein leerer Dict, Set oder Liste hat Wahrheitswert False, während in Javascript es gilt als 'true' .. Beispiel:

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

    Es gibt mindestens drei Möglichkeiten, dies zu lösen:

    • Verwenden Sie die -t-Flag bei der Umwandlung von Python in Javascript zB: $ transcrypt -t python.py (nicht empfohlen, aber wahrscheinlich ist kein Problem, wenn Sie auf Wahrheit viele Male in inneren Schleifen der Leistung empfindlichen Code ..)
    • Verwenden Sie __pragma__(tconv) oder __pragma__(notconv) innerhalb Ihres Codes, um dem Transcrypt-Compiler zu sagen, dass die automatische Umwandlung in pythonähnliche Wahrheitswerte lokal eingeschaltet wird.
    • Anstatt auf den Wahrheitswert zu überprüfen, vermeide das Problem ganz, indem du nur len (myList) überprüft hast.> 0 … Vielleicht geht das für die meisten Situationen gut, macht der Job für mein Licht.

    Richtig, so dass mein Projekt wurde immer größer und ich wollte vorkompilieren für eine Leistungssteigerung aber fand es schwer, dies zu tun mit Brython (obwohl es technisch möglich ist, eine einfache Möglichkeit, die Online-Editor verwenden und klicken Sie auf die Javascript-Taste zu sehen die Ausgabe). Ich habe das getan und mit dem erzeugten Javascript von project.html verknüpft, aber es hat aus irgendeinem Grund nicht funktioniert. Auch finde ich es schwer, Fehlermeldungen von Brython zu verstehen, also wusste ich nicht, wo ich anfangen soll, nachdem dieser Schritt fehlgeschlagen ist. Auch die große Größe des ausgegebenen Codes und die Größe des Brython-Motors fing an, mich zu beheben. Also habe ich beschlossen, einen genaueren Blick auf Transcrypt zu werfen, der anfangs höher eingestuft wurde, weil ich lieber dumbed down Anweisungen, die mir sagen, wie man sofort losfährt (diese sind seitdem hinzugefügt worden).

    Die Hauptsache, die es nach der Installation von Python3.5 eingerichtet hat, war 1) use venv (es ist wie eine neue eingebaute Version von virtualenv, die weniger Platz für jedes Projekt verwendet), um einen python3.5 Projektordner einzurichten (nur geben Sie python3 ein .5 -m venv foldername – workaround für ubuntu mit Paketfragen für 3.5 ). Dies macht unter anderem einen "Foldername" mit einem Bin Unterordner. 2) installiere Transcrypt python package mit pip ('foldername / bin / pip install transcrypt'), die es auf foldername / lib / python3.5 / site-packages / transcrypt installiert. 3) 'aktiviere' das aktuelle Terminal, wenn du nicht immer den vollständigen Pfad zu foldername / bin / python3.5 eingeben willst. Aktivieren Sie durch Eingabe: 'Quell-Folderame / Bin / Aktivieren' 4) Schreiben Sie Code und kompilieren Sie es in Javascript zum Testen. Kompilieren Sie aus dem Ordner, in dem Sie Ihren Code schreiben. Zum Beispiel habe ich foldername / www / project verwendet. Also CD in diesen Ordner und laufe: 'transcrypt -b your_python_script.py'. Das bringt die Ausgabe in einen Unterordner namens __javascript__ . Sie können dann mit dem ausgegebenen Javascript von Ihrem HTML-Link verknüpfen.

    Hauptprobleme bewegen sich

    Ich habe ziemlich einfache Bedürfnisse, also kann deine Meilenzahl variieren

    • Sie müssen brython oder python standard libs mit javascript libs ersetzen. So zum Beispiel 'import json' wird von Brython zur Verfügung gestellt, aber unter Transcrypt kannst du ein Javascript lib verwenden oder einfach nur JSON.parse / JSON.stringify direkt in deinem Python Code verwenden. Um eine verkleinerte Version einer Javascript-Bibliothek direkt in deinem Python-Code zu verwenden, benutze dieses Format (beachten Sie die dreifachen Zitate):

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

    • Brythons html-spezifische Funktionen funktionieren nicht mit Transcrypt offensichtlich. Verwenden Sie einfach die normalen Javascript-Wege. Beispiele: 1) Unter Brython kannst du auf ein bestimmtes HTML-Tag mit 'document [' id ']' verwiesen haben, aber mit Transcrypt würdest du 'document.getElementById (' id ') verwenden (was genau so ist Es aus Javascript). 2) Du kannst einen Knoten nicht mit 'del nodeName' löschen (bcs das ist eine Brython-Funktion). Benutze etwas wie 'node.parentNode.removeChild (node)'. 3) ersetzen Sie alle DOM-Funktionen von brython mit den Javascript-Alternativen. ZB class_name = className; Text = textContent; Html = innerHTML; Parent = parentNode; Kinder = childNodes etc. Ich denke, wenn Sie etwas brauchen, das Alternativen enthält, die von einigen älteren Browsern benötigt werden, dann gibt es Javascript-Bibliotheken dafür. 4) Brythons Set_timeout wird durch Javascripts ersetzt setTimeout 5) Brythons html-Tags wie BR () müssen mit den normalen Javascript-Weisen ersetzt werden, sowie die Wiederherstellung von Orten, die du benutzt hast <= dom Manipulationssyntax. Entweder injizieren Sie einfaches Text-Markup als innerHTML oder machen Sie die Elemente mit Javascript-Syntax und dann anfügen sie mit normalen Javascript DOM-Syntax. Ich habe auch bemerkt, dass für Checkboxen brython verwendet "if checkbox = 'checked':" aber Transcrypt ist glücklich mit "if checkbox:" ..

    • Ich habe in der vergangenen Woche ein 2700-Zeilen-Projekt beendet, zu welcher Zeit Transcrypt keine Unterstützung für ein paar kleinere Dinge hatte (obwohl sie einfach genug waren, um mit Füllern zu ersetzen), das waren 1) str.lower, str.split (str. Split ist vorhanden, scheint aber die Javascript-Split zu sein, die anders mit der Python-Version arbeitet, auf deren Verhalten ich mich verlassen konnte), 2) Runde (dies scheint in der dev-Version jetzt zu spielen) und 3) isinstance didn 'T Arbeit an str, int und float, nur auf dict, list und set. 4) Ein anderer Unterschied von Brython, den ich bemerkt habe, ist, dass wenn ich in einer JSON-Darstellung eines Diktats ziehe, muss ich dies mit "myDict = dict (data)" tun, während brython mit 'myDict = data' zufrieden war. Aber das könnte mit etwas in Brythons json.loads verwandt sein, das ich direkt mit JSON.parse ersetzt habe. 5) Auch ohne ausdrücklich fähige Transcrypts Operator Überladung (mit -o Schalter für global oder __pragma__('opov') für lokal), können Sie nicht Dinge wie Set-Operationen mit dem überladenen Format, sondern müssen die entsprechenden Funktionen verwenden. Z.B

       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) Auch kannst du Dicts standardmäßig nicht mit "für i in dict:" iterieren, ohne es zu aktivieren (cmd line -i oder __pragma__('iconv') , aber du kannst es vermeiden, es nur mit den Tasten zu aktivieren () Mitglied zB:

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

    Zusammenfassen

    • Ich mag Brython, weil es einfach ist, damit loszugehen und deinen Code zu testen (nur F5). Es ist näher an echter Python, weil die meisten der Standard-lib ist da. Ich mag es nicht, die Transpilations-Engine (Bearbeiten: oder man könnte es als Python VM) im Browser und die große ausgegebene Javascript-Größe. Wenn ich die Dinge machen musste (aber immer noch mit Brython), hätte ich Javascript-Methoden verwendet, um das DOM von Brython zu manipulieren (was du tun kannst ..), anstatt so viel auf die Brython-Methoden zu lehnen, weil das verschwendete Zeit, die sich bewegt Zu einem anderen transpiler, wenn meine Bedürfnisse geändert wurden.

    • Ich mag Transcrypt, weil das ausgegebene Javascript wirklich "schlank und gemein" ist und weil das einzige, was du Browser-Seite liest, dein generierter Javascript-Code ist, der in der Größe deinem Python-Code ähnlich ist. Auch weil es sourcemaps unterstützt und weil es mir ein Maß für die Kontrolle über das ausgegebene Javascript gibt. Und es hat mich ein bisschen über die Optimierung gelehrt.

    Hoffe, das hilft jemand sehen, welche von diesen für ihr besonderes Projekt gut sein könnte.

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

    Diese Seite benchmarks die drei Kandidaten. Brython taucht als klarer Sieger auf.

    Trotz der "Hilfe", die erklärt, dass SO für diese Art von Frage nicht gut ist, scheint es, dass eine prägnante Antwort in diesem Fall möglich ist.

    Vielleicht sind die Leute zu voreilig?

    Zuerst bin ich ein Brython Committer. Trotzdem werde ich versuchen, so unparteiisch wie möglich zu sein, um eine objektive Bewertung zu machen.

    Das letzte Mal habe ich es benutzt Skulpt hat keine Features wie Generatorausdrücke unterstützt. Brython und PyPy.js tun so, also auf der Feature-Ebene IMHO die später sind überlegen.

    Brython (zu dieser Zeit) ist noch in Arbeit. Einige Module können nicht importiert werden (zB xml.ElementTree ). Trotzdem beginnt sich diese Situation zu ändern, da wir trotz der vollen Kompatibilität mit den Standards (zumindest wenn es sinnvoll ist) auf die Ausführung der gesamten CPython-Test-Suite hinarbeiten.

    Brython unterstützt auch .vfs.js, um Modulimporte zu beschleunigen.

    PyPy.js hat eine Reihe von Merkmalen, die einfach von der Tatsache, dass es von PyPy (JIT Compilation, gut getestet, …), aber ich bin nicht sicher, ob es für den Betrieb im Browser geeignet ist. Das könnte sich ändern, wenn sich das Projekt entwickelt.

    TODO: Ich werde versuchen, meine Antwort mit zuverlässigen Benchmarks zu ergänzen.

    Ich habe verwendet und verpflichtet zu skulpt sowie pypyjs. Und sie sind alle drei sehr unterschiedlich, dass jeder Vergleich ist moot, wenn Sie mich fragen.

    Es hängt davon ab, was du suchst, was das sinnvollste macht.

    PyPyJS

    Pypyjs ist riesig es ist eine 12MB Javascript-Datei, die die gesamte pypy virtuelle Maschine enthält. Also, wenn Sie Python-Implementierung Vollständigkeit wollen, ist dies Ihr Baby. Es hat eine Javascript-Brücke, die wirklich gut funktioniert, aber es ist keine praktikable Option für das Schreiben Ihrer Javascript Website-Code in Python. Es wird Ihnen jedoch import compiler .

    Es ist mit emscripten gebaut und ist schneller als CPython, bei der Ausführung der Pymond-Benchmark.

    Ich habe kurz gesagt über Pypyjs hier sind die Rutschen.

    Skulpt

    Ist ein Lehr-Tool (oder es hat sich im Laufe der Zeit entwickelt), es kompiliert Ihre Python in eine staatliche Maschine sehr eng emulieren die cpython-Compiler. Im Kern ist es eine handschriftliche Umsetzung des Python-Compilers in Javascript. Es ermöglicht eine asynchrone Ausführung, die Sie tun können:

     while (True): print "hi" 

    Ohne den Browser zu verriegeln.

    Skulpt ist die einzige, die asynchrone Fortsetzungen unterstützt, lässt es Sie pausieren die Ausführung von Python, während es eine asynchrone Sache zu lösen ist passieren. Diese Arbeit machen:

     from time import sleep sleep(1) 

    Skulpt läuft bei etwa einem Zehntel der Geschwindigkeit von CPython, beim Vergleich von Pystone.

    Brython

    Ich weiß es am wenigsten, dass man vielleicht auch eine Olemis-Lang erweitern kann. Aber neben dem offensichtlichen Unterschied, dass Brython ist py3 und die anderen py2. Brython ist auch ein Transporter.

    Brython läuft nicht den Pystone-Benchmark, weil time.clock nicht implementiert ist, denn offiziell ist es eine Hardware-Funktion.

    Da es niemand erwähnt hat, dachte ich, es lohnt sich, Batavia zu erwähnen, die die virtuelle Maschine von Python implementiert, um den vorkompilierten Python-Bytecode auszuführen.

    Ich habe es gerade ausprobiert, und während es ein interessantes Konzept ist, ist es noch im frühen Stadium, da es wenig Dokumentation gibt.

    Am Ende wird es davon abhängen, was du zu tun versuchst. Ich wählte Transcrypt nach einem Blick, weil es mehr pragmatisch und besser performant war, auch vor kurzem veröffentlicht / gepflegt.

    Nicht hier erwähnt ist RapydScript oder RapydScript-NG. Sie produzieren sehr effizienten JavaScript-Code, der in GlowScript VPython (glowscript.org) verwendet wird. Ich verwendete das ursprüngliche RapydScript von Alex Tsepkov ( https://github.com/atsepkov/RapydScript ), aber vor kurzem wechselte ich zu RapydScript-NG von Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ). Ich habe vor kurzem den Pystone-Benchmark auf CPython, RapydScript und Brython gerannt, und Sie können die Ergebnisse hier sehen:

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

    Python ist die beste Programmiersprache der Welt.