Hier einige Informationen zu Brython vs Transcrypt (Juli 2016, da Transcrypt vom OP als Option zu dieser Frage hinzugefügt wurde), die durch den Start eines Projekts mit Brython vor einigen Monaten und den Wechsel zu Transcrypt (Abschluss des Umzugs letzte Woche) gewonnen wurden. Ich mag Brython und Transcrypt und kann Verwendungen für beide sehen.
Für Neueinsteiger "transpilieren" Brython und Transcrypt beide Python-Eingaben in Javascript (Bearbeiten: Vielleicht ist es besser, Brython als "Python-Implementierung für den Browser" anzusehen, da es kein eigenständiges Javascript erzeugt). Beide erfordern die Python 3-Syntax. Brython enthält eine beträchtliche Anzahl von Python-Standardbibliotheken und einige eigene für den Umgang mit webbezogenen Dingen, während Transcrypt dies größtenteils vermeidet und stattdessen die Verwendung von Javascript-Bibliotheken vorschlägt.
Brython ( Github) kann die Konvertierung im Browser durchführen. Sie schreiben also in Python und die brython.js-Engine konvertiert es im laufenden Betrieb in Javascript, wenn die Seite geladen wird. Dies ist sehr praktisch und viel schneller als Sie vielleicht denken. Die brython.js-Engine, die Sie in Ihre Seiten aufnehmen müssen, ist jedoch ungefähr 500 KB groß. Es geht auch darum, Standardbibliotheken zu importieren, die Brython durch Abrufen separater JS-Dateien mit XHR-Anforderungen erledigt. Einige Bibliotheken sind bereits in brython.js kompiliert, sodass nicht bei jedem Import neue Dateien abgerufen werden. Wenn Sie jedoch viele Importe verwenden, kann es langsam werden. Es gibt jedoch Möglichkeiten, dies zu umgehen. Ich habe auf der Registerkarte "Netzwerk" in den Browser-Entwicklungstools überprüft, welche Dateien beim Laden der Seite abgerufen wurden, und dann alle Dateien gelöscht, die mein Projekt nicht in einer Kopie des Brython src-Ordners verwendet hat. und führen Sie das in Brython enthaltene Skript aus (ich glaube, es befindet sich in Brython / www / scripts / make_VFS.py), das alle verfügbaren Bibliotheken in einer Datei namens py_VFS.js kompiliert, auf die Sie auch von Ihrem HTML-Code aus verlinken müssen. Normalerweise wird eine riesige Datei mit mehr als 2 MB erstellt. Wenn Sie jedoch die Dinge löschen, die Sie nicht verwenden, kann dies sehr klein sein. Wenn Sie dies auf diese Weise tun, müssen Sie nur brython.js, py_VFS.js und Ihren Python-Code abrufen, und es werden keine zusätzlichen XHR-Anforderungen benötigt.
Transcrypt ( Github ) wird dagegen als Python 3-Paket vertriebendie Sie manuell verwenden oder in Ihre Toolchain einbinden können, um Python im Voraus in Javascript zu kompilieren. Mit Transcrypt schreiben Sie also in Python, führen Transcrypt für Python aus und es spuckt Javascript aus, auf das Sie in Ihrem Projekt verlinken können. Es ähnelt eher einem herkömmlichen Compiler, da es eine gewisse Kontrolle über die Ausgabe bietet. Sie können beispielsweise wählen, ob Sie mit ES6 oder ES5 kompilieren oder Sourcemaps ausgeben möchten (während des Debuggens führt der Browser Sie direkt zum entsprechenden Python-Code anstelle des generierten Javascript-Codes.) Die Javascript-Ausgabe von Transcrypt ist ziemlich knapp ( oder anders ausgedrückt, es ist hübsch und knapp). In meinem Fall werden 150 KB Python in 165 KB nicht minimiertes ES5-Javascript konvertiert. Zum Vergleich: In der Brython-Version meines Projekts wurden nach der Konvertierung ca. 800 KB verwendet.
Um jedoch die Vorteile der Knappheit von Transcrypts nutzen zu können, müssen Sie die Dokumente ein wenig lesen (wirklich nur ein bisschen). Beispielsweise ist bei Transcrypt die "Wahrhaftigkeit" von Python für Datenstrukturen wie "diktieren", "setzen" und "auflisten" nicht standardmäßig aktiviert, und die globale Aktivierung wird aufgrund potenzieller Leistungsprobleme im Zusammenhang mit Typüberprüfungen nicht empfohlen. Zur Verdeutlichung: Unter CPython hat ein leeres Diktat, eine leere Menge oder eine leere Liste den Wahrheitswert False, während sie in Javascript als "wahr" betrachtet wird. 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 beheben:
- Verwenden Sie das Flag -t, wenn Sie Python in Javascript konvertieren, z. B.: $ Transcrypt -t python.py (nicht empfohlen, aber wahrscheinlich kein Problem, es sei denn, Sie überprüfen die Richtigkeit in inneren Schleifen von leistungsempfindlichem Code mehrmals.)
- Verwenden Sie
__pragma__(tconv)
oder __pragma__(notconv)
in Ihrem Code, um den Transcrypt-Compiler anzuweisen, die automatische Konvertierung in pythonähnliche Wahrheitswerte lokal einzuschalten.
- Anstatt nach dem Wahrheitswert zu suchen, vermeiden Sie das Problem insgesamt, indem Sie nur len (myList)> 0 überprüfen ... Vielleicht ist das in den meisten Situationen in Ordnung, erledigt den Job für meinen leichten Gebrauch.
Richtig, mein Projekt wurde also größer und ich wollte vorkompilieren, um einen Leistungsgewinn zu erzielen, aber es fiel mir schwer, dies mit Brython zu tun (obwohl es technisch möglich ist, ist es einfach, den Online-Editor zu verwenden und auf die Javascript-Schaltfläche zu klicken, um zu sehen die Ausgabe). Ich habe das getan und mit dem generierten Javascript aus project.html verlinkt, aber es hat aus irgendeinem Grund nicht funktioniert. Außerdem fällt es mir schwer, Fehlermeldungen von Brython zu verstehen, sodass ich nicht wusste, wo ich anfangen soll, nachdem dieser Schritt fehlgeschlagen ist. Auch die große Größe des ausgegebenen Codes und die Größe der Brython-Engine begannen mich zu nerven. Deshalb habe ich mich für Transcrypt entschieden, das zunächst eine höhere Qualität zu haben schien, da ich lieber dumme Anweisungen bevorzuge, die mir sagen, wie ich sofort anfangen soll (diese wurden inzwischen hinzugefügt).
Die Hauptsache nach der Installation von Python3.5 war:
- Verwenden Sie venv (es ist wie eine neue integrierte Version von virtualenv, die weniger Speicherplatz für jedes Projekt benötigt), um einen python3.5-Projektordner einzurichten (geben Sie einfach Folgendes ein: python3.5 -m venv-Ordnername - Problemumgehung für Ubuntu mit Paketproblemen für 3.5 ). Dies macht unter anderem 'Ordnername' mit einem bin-Unterordner.
- Installieren Sie das Transcrypt-Python-Paket mit pip ('Ordnername / bin / pip-Installation transcrypt'), das es unter dem Ordnernamen / lib / python3.5 / site-packages / transcrypt installiert.
activate
das aktuelle Terminal, wenn Sie nicht jedes Mal den vollständigen Pfad zu Ordnername / bin / python3.5 eingeben müssen. Aktivieren Sie durch Eingabe von: 'Quellordnername / bin / enable'
- Beginnen Sie mit dem Schreiben von Code und kompilieren Sie ihn zum Testen in Javascript. Kompilieren Sie aus dem Ordner, in den Sie Ihren Code schreiben. Zum Beispiel habe ich den Ordnernamen / www / project verwendet. Legen Sie also eine CD in diesen Ordner und führen Sie Folgendes aus: 'Transcrypt -b your_python_script.py'. Dadurch wird die Ausgabe in einen Unterordner namens aufgerufen
__javascript__
. Sie können dann von Ihrem HTML-Code aus auf das ausgegebene Javascript verlinken.
Hauptthemen, die sich bewegen
Ich habe ziemlich einfache Bedürfnisse, daher kann Ihr Kilometerstand variieren.
Sie müssen Brython- oder Python-Standardbibliotheken durch Javascript-Bibliotheken ersetzen. So wird beispielsweise 'import json' von Brython bereitgestellt, aber unter Transcrypt können Sie eine Javascript-Bibliothek verwenden oder einfach JSON.parse / JSON.stringify direkt in Ihrem Python-Code verwenden. Verwenden Sie dieses Format, um eine verkleinerte Version einer Javascript-Bibliothek direkt in Ihren Python-Code aufzunehmen (beachten Sie die dreifachen Anführungszeichen):
__pragma__ ('js', '{}', '''
// javascript code
''')
Brythons HTML-spezifische Funktionen funktionieren offensichtlich nicht mit Transcrypt. Verwenden Sie einfach die normalen Javascript-Methoden. Beispiele: 1) Unter Brython haben Sie möglicherweise mit 'document [' id ']' auf ein bestimmtes HTML-Tag verwiesen, aber mit Transcrypt würden Sie 'document.getElementById (' id ') verwenden (genau wie Sie) es aus Javascript). 2) Sie können einen Knoten nicht mit 'del nodeName' löschen (bcs, das ist eine Brython-Funktion). Verwenden Sie so etwas wie 'node.parentNode.removeChild (node)'. 3) Ersetzen Sie alle DOM-Funktionen von brython durch die Javascript-Alternativen. zB Klassenname = Klassenname; text = textContent; html = innerHTML; parent = parentNode; Kinder = Kinderknoten usw. Ich denke, wenn Sie etwas benötigen, das Alternativen enthält, die von einigen älteren Browsern benötigt werden, dann gibt es dafür Javascript-Bibliotheken. 4) Brythons set_timeout wird durch Javascripts ersetzt setTimeout 5) Brythons HTML-Tags wie BR () müssen auf die normale Weise mit Javascript ersetzt werden und alle Stellen, an denen Sie die Syntax <= dom manipulation verwendet haben, werden wiederholt. Fügen Sie entweder Nur-Text-Markups als innerHTML ein oder erstellen Sie die Elemente mithilfe der Javascript-Syntax und hängen Sie sie dann mit der normalen Javascript-DOM-Syntax an. Mir ist auch aufgefallen, dass brython für Kontrollkästchen "if checkbox = 'check':" verwendet, Transcrypt jedoch mit "if checkbox:" zufrieden ist. Fügen Sie entweder Nur-Text-Markups als innerHTML ein oder erstellen Sie die Elemente mithilfe der Javascript-Syntax und hängen Sie sie dann mit der normalen Javascript-DOM-Syntax an. Mir ist auch aufgefallen, dass brython für Kontrollkästchen "if checkbox = 'check':" verwendet, Transcrypt jedoch mit "if checkbox:" zufrieden ist. Fügen Sie entweder Nur-Text-Markups als innerHTML ein oder erstellen Sie die Elemente mithilfe der Javascript-Syntax und hängen Sie sie dann mit der normalen Javascript-DOM-Syntax an. Mir ist auch aufgefallen, dass brython für Kontrollkästchen "if checkbox = 'check':" verwendet, Transcrypt jedoch mit "if checkbox:" zufrieden ist.
Ich habe letzte Woche ein 2700-Zeilen-Projekt fertiggestellt. Zu diesem Zeitpunkt hatte Transcrypt keine Unterstützung für ein paar Kleinigkeiten (obwohl sie leicht durch Füllstoffe zu ersetzen waren). Dies waren 1) str.lower, str.split (str. split ist vorhanden, scheint aber der Javascript-Split zu sein, der anders funktioniert als die Python-Version, auf deren Verhalten ich mich verlassen habe), 2) round (dies scheint jetzt in der Dev-Version unterstützt zu werden) und 3) isinstance didn Arbeiten Sie nicht mit str, int und float, sondern nur mit dict, list und set. 4) Ein weiterer Unterschied zu Brython, den ich bemerkt habe, ist, dass ich, wenn ich eine JSON-Darstellung eines Diktats eingebe, dies mit 'myDict = dict (data)' tun muss, während brython mit 'myDict = data' zufrieden war. Aber das könnte mit etwas in Brythons json.loads zusammenhängen, das ich direkt durch JSON.parse ersetzt habe.__pragma__('opov')
für local) können Sie keine Set-Operationen mit dem überladenen Format ausführen, 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) Sie können Diktate auch nicht standardmäßig mit 'for i in dict:' iterieren, ohne dies zu aktivieren (cmd line -i oder __pragma__('iconv')
, aber Sie können vermeiden, dass Sie es aktivieren müssen, indem Sie nur das Mitglied keys () verwenden, z.
for key, value in dict.items():
# do things for each key and value..
Zusammenfassen
Ich mag Brython, weil es einfach ist, damit loszulegen und Ihren Code zu testen (nur F5). Es ist näher an echtem Python, weil der größte Teil der Standardbibliothek vorhanden ist. Ich mag es nicht, die Transpilations-Engine (Bearbeiten: Oder man könnte sie als Python-VM betrachten) in den Browser und die große ausgegebene Javascript-Größe aufnehmen zu müssen. Wenn ich Dinge überarbeiten müsste (aber immer noch Brython verwenden würde), hätte ich Javascript-Methoden verwendet, um das DOM von Brython aus zu manipulieren (was Sie tun können ..), anstatt mich so sehr auf die Brython-Methoden zu stützen, weil dies Zeitverschwendung verschwendete zu einem anderen Transpiler, wenn sich meine Bedürfnisse geändert haben.
Ich mag Transcrypt, weil das ausgegebene Javascript wirklich "schlank und gemein" ist und weil das einzige, was Sie auf der Browserseite laden, Ihr generierter Javascript-Code ist, dessen Größe Ihrem Python-Code ähnelt. Auch weil es Sourcemaps unterstützt und weil es mir ein gewisses Maß an Kontrolle über das ausgegebene Javascript gibt. Und damit habe ich einiges über Optimierung gelernt.
Ich hoffe, das hilft jemandem zu erkennen, welche davon für sein bestimmtes Projekt gut sein könnten.