Python en el navegador: ¿Cómo elegir entre Brython, PyPy.js, Skulpt y Transcrypt?

89

Estoy muy emocionado de ver que ahora es posible codificar Python en el navegador. Estos son los principales candidatos (agregue cualquiera que haya pasado por alto):

Pero, ¿cómo elegir entre ellos? La única diferencia obvia que puedo ver es que Skulpt se basa en Python 2, mientras que Brython se basa en Python 3.

Tenga en cuenta: esta no es una solicitud de recomendaciones u opiniones. Estoy buscando hechos objetivos que sirvan de base a una elección informada.

Pi
fuente
6
Pedirnos que recomiende la mejor biblioteca para algo es uno de los casos en los que la ayuda explica explícitamente que StackOverflow no es bueno. Es una gran pregunta, pero no para el formato de este sitio; Probablemente desee algo basado en debates, como una lista de correo o un foro.
abarnert
2
Transcrypt ( transcrypt.org ) se compila a partir de un gran subconjunto de python3.5 inc. herencia múltiple, genera código rápido (memorización de llamadas), pequeño y legible, admite mapas de origen multinivel y puede usar cualquier biblioteca JS sin adaptación. Descargo de responsabilidad: lo escribí.
Jacques de Hooge
1
Hola, fzzylogic, agregué la etiqueta, por lo que la gente ahora puede hacer preguntas sobre SO usándola. Reemplazó la etiqueta JS por ella, porque es la menos probable en la que buscar si prefiere usar Python en el navegador.
Jacques de Hooge
1
He escrito una especie de tutorial de Transcrypt para principiantes. Puede verlo en github.com/bunkahle/Transcrypt-Examples/blob/master/alerts/… y github.com/bunkahle/Transcrypt-Examples/blob/master/cookies/…
bunkus
1
La respuesta eliminada de dstromberg con 27 votos a favor tiene un buen enlace de comparación: stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html
Cees Timmerman

Respuestas:

26

Ejecutar Python en el navegador es un artículo realmente bueno y actualizado (a partir de 2019) que compara Brython, Skulpt, PyPy.js, Transcrypt, Pyodide, Batavia . Recomiendo fuertemente leer esto.

Un buen resumen se puede ver en las siguientes imágenes.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

laike9m
fuente
61

Aquí hay información sobre Brython vs Transcrypt (julio de 2016, ya que el OP agregó Transcrypt como una opción en esta pregunta), obtenida al comenzar un proyecto con Brython hace unos meses y pasar a Transcrypt (se completó la mudanza la semana pasada). Me gustan Brython y Transcrypt y puedo ver los usos de ambos.

Para las personas que son nuevas en esto, Brython y Transcrypt 'transpilan' la entrada de Python a javascript (Editar: tal vez sea mejor ver a Brython como una 'implementación de Python para el navegador' porque no produce javascript independiente). Ambos requieren la sintaxis de Python 3. Brython incluye una cantidad sustancial de bibliotecas estándar de Python y algunas propias para lidiar con cosas relacionadas con la web, mientras que Transcrypt evita eso en su mayor parte y sugiere usar bibliotecas Javascript en su lugar.

Brython ( Github) puede hacer la conversión en el navegador. Entonces, escribe en python y el motor brython.js lo convierte a javascript sobre la marcha cuando se carga la página. Esto es realmente conveniente y es mucho más rápido de lo que piensa. Sin embargo, el motor brython.js que debe incluir en sus páginas es de aproximadamente 500Kb. Además, está la cuestión de importar bibliotecas estándar, que Brython maneja obteniendo archivos .js separados con solicitudes XHR. Algunas bibliotecas ya están compiladas en brython.js, por lo que no todas las importaciones extraerán archivos nuevos, pero si usa muchas importaciones, las cosas pueden volverse lentas. Sin embargo, hay formas de evitar esto. Lo que hice fue verificar la pestaña de red en las herramientas de desarrollo del navegador para ver qué archivos se estaban ingresando cuando se cargó la página, luego eliminar todos los archivos que mi proyecto no estaba usando en una copia de la carpeta Brython src, y ejecute el script incluido con Brython (creo que está en Brython / www / scripts / make_VFS.py) que compila todas las bibliotecas disponibles en un archivo llamado py_VFS.js al que también debe vincular desde su html. Normalmente, hará un archivo enorme de más de 2 MB, pero si elimina las cosas que no está usando, puede ser bastante pequeño. Si lo hace de esta manera, solo necesita ingresar brython.js, py_VFS.js y su código de Python, y no se necesitarán solicitudes XHR adicionales.

Transcrypt ( Github ) por otro lado, se distribuye como un paquete de Python 3que puede usar manualmente, o conectarlo a su cadena de herramientas, para compilar Python en javascript por adelantado. Entonces, con Transcrypt, escribe en python, ejecuta transcrypt contra Python y escupe javascript que puede vincular en su proyecto. Es más como un compilador tradicional también en el sentido de que ofrece cierto control sobre la salida. Por ejemplo, puede optar por compilar en ES6 o ES5, o pedirle que genere mapas de origen (que durante la depuración permitan que el navegador lo lleve directamente al código python correspondiente, en lugar del código javascript generado). La salida javascript de Transcrypt es bastante concisa ( o dicho de otra manera, es bonito y conciso). En mi caso, 150kB de python se convierten en 165kB de javascript ES5 no minificado. A modo de comparación, la versión Brython de mi proyecto usó alrededor de 800Kb después de la conversión.

Sin embargo, para obtener los beneficios de la concisión de Transcrypts, es necesario leer un poco los documentos (en realidad, solo un poco). Por ejemplo, con Transcrypt, la 'veracidad' de Python para estructuras de datos como dict, set y list no está habilitada de forma predeterminada y no se recomienda habilitarla globalmente debido a posibles problemas de rendimiento relacionados con la verificación de tipos. Para mayor claridad: en CPython, un dict, conjunto o lista vacío tiene un valor de verdad False, mientras que en Javascript se considera "verdadero". Ejemplo:

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

Hay al menos tres formas de abordar esto:

  • Use la marca -t al convertir python a javascript, por ejemplo: $ transcrypt -t python.py (no se recomienda, pero probablemente no sea un problema a menos que verifique la veracidad muchas veces en los bucles internos del código sensible al rendimiento).
  • Use __pragma__(tconv)o __pragma__(notconv)dentro de su código para decirle al compilador de transcriptación que active la conversión automática a valores de verdad similares a Python localmente.
  • En lugar de verificar el valor de verdad, evite el problema por completo simplemente verificando len (myList)> 0 ... Tal vez eso esté bien para la mayoría de las situaciones, funciona para mi uso ligero.

Correcto, entonces mi proyecto se estaba haciendo más grande y quería precompilar para mejorar el rendimiento, pero me resultó difícil hacerlo con Brython (aunque es técnicamente posible, una forma fácil es usar el editor en línea y hacer clic en el botón JavaScript para ver La salida). Hice eso y me vinculé al javascript generado desde project.html pero no funcionó por alguna razón. Además, me resulta difícil entender los mensajes de error de Brython, por lo que no sabía por dónde empezar después de que este paso fallara. Además, el gran tamaño del código generado y el tamaño del motor brython comenzaban a molestarme. Así que decidí echar un vistazo más de cerca a Transcrypt, que al principio parecía ser de mayor calidad porque prefiero instrucciones simplificadas que me digan cómo comenzar de inmediato (estas ya se agregaron).

Lo principal para configurarlo después de instalar Python3.5 fue:

  1. Use venv (es como una nueva versión incorporada de virtualenv que usa menos espacio para cada proyecto) para configurar una carpeta de proyecto python3.5 (simplemente escriba: python3.5 -m venv foldername - solución para ubuntu con problemas de paquetes para 3.5 ). Esto crea 'nombre de carpeta' con una subcarpeta bin, entre otras cosas.
  2. Instale el paquete Python de Transcrypt con pip ('nombre de carpeta / bin / pip install transcrypt') que lo instala en nombre de carpeta / lib / python3.5 / site-packages / transcrypt.
  3. activatela terminal actual si no desea tener que escribir la ruta completa al nombre de la carpeta / bin / python3.5 cada vez. Activar escribiendo: 'nombre de carpeta de origen / bin / activar'
  4. Comience a escribir código y compilarlo en javascript para probarlo. Compile desde la carpeta en la que escribe su código. Por ejemplo, usé nombre de carpeta / www / proyecto. Así que CD en esa carpeta y ejecute: 'transcrypt -b your_python_script.py'. Eso coloca la salida en una subcarpeta llamada __javascript__. Luego puede vincular al javascript generado desde su html.

Principales problemas que se mueven

Tengo necesidades bastante simples, por lo que su kilometraje puede variar.

  • Debe reemplazar las bibliotecas estándar de brython o python con bibliotecas de JavaScript. Entonces, por ejemplo, Brython proporciona 'import json', pero en Transcrypt puede usar una biblioteca de JavaScript o simplemente usar JSON.parse / JSON.stringify directamente en su código Python. Para incluir una versión reducida de una biblioteca de JavaScript directamente en su código de Python, use este formato (tenga en cuenta las comillas triples):

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
    
  • Las funciones específicas de html de Brython no funcionan con Transcrypt obviamente. Simplemente use las formas normales de JavaScript. Ejemplos: 1) en Brython, es posible que se haya referido a una etiqueta HTML específica usando 'document [' id ']', pero con Transcrypt usaría 'document.getElementById (' id ') (que es de la misma manera que lo hace desde javascript). 2) No puede eliminar un nodo con 'del nodeName' (bcs es una función de brython). Utilice algo como 'node.parentNode.removeChild (node)'. 3) reemplace todas las funciones DOM de brython con las alternativas de javascript. por ejemplo, class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes, etc. Supongo que si necesita algo que contenga las alternativas requeridas por algunos navegadores más antiguos, existen bibliotecas de JavaScript para eso. 4) El set_timeout de Brython se reemplaza con los javascripts setTimeout 5) Las etiquetas html de Brython como BR () deben reemplazarse usando las formas normales de JavaScript, así como también rehacer cualquier lugar en el que haya usado su <= sintaxis de manipulación dom. Inyecte marcado de texto sin formato como innerHTML o cree los elementos usando la sintaxis de JavaScript y luego adjúntelos usando la sintaxis DOM de JavaScript normal. También noté que para las casillas de verificación brython usa "if checkbox = 'check':" pero Transcrypt está contento con "if checkbox:" .. Inyecte el marcado de texto sin formato como innerHTML o cree los elementos usando la sintaxis de JavaScript y luego adjúntelos usando la sintaxis DOM de JavaScript normal. También noté que para las casillas de verificación brython usa "if checkbox = 'check':" pero Transcrypt está contento con "if checkbox:" .. Inyecte marcado de texto sin formato como innerHTML o cree los elementos usando la sintaxis de JavaScript y luego adjúntelos usando la sintaxis DOM de JavaScript normal. También noté que para las casillas de verificación brython usa "if checkbox = 'check':" pero Transcrypt está contento con "if checkbox:" ..

  • Terminé de mover un proyecto de 2700 líneas durante la semana pasada, momento en el que Transcrypt no tenía soporte para algunas cosas menores (aunque eran lo suficientemente fáciles de reemplazar con rellenos), estas eran 1) str.lower, str.split (str. split está presente, pero parece ser el split de javascript, que funciona de manera diferente a la versión de Python, en cuyo comportamiento confiaba), 2) round (esto parece ser compatible con la versión dev ahora) y 3) isinstance didn no funciona en str, int y float, solo en dict, list y set. 4) Otra diferencia de Brython que noté es que si obtengo una representación JSON de un dict, necesito hacerlo usando 'myDict = dict (data)', mientras que brython estaba contento con 'myDict = data'. Pero eso podría estar relacionado con algo en json.loads de Brython, que reemplacé directamente con JSON.parse.__pragma__('opov')para local), no puede hacer cosas como establecer operaciones usando el formato sobrecargado, pero necesita usar las funciones correspondientes. P.ej

    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) Además, no puede iterar dictados de forma predeterminada usando 'for i in dict:', sin habilitar eso (cmd line -i o __pragma__('iconv'), pero puede evitar tener que habilitarlo simplemente usando el miembro keys (), por ejemplo:

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

Resumir

  • Me gusta Brython porque es fácil de usar y probar su código (solo F5). Está más cerca de Python verdadero porque la mayoría de las bibliotecas estándar están ahí. No me gusta tener que incluir el motor de transpilación (Editar: O uno podría verlo como una máquina virtual de Python) en el navegador y el gran tamaño de salida de JavaScript. Si tuviera que hacer las cosas de nuevo (pero aún usando Brython), habría usado métodos de javascript para manipular el DOM de brython (lo que puede hacer ...), en lugar de depender tanto de los métodos de brython porque esa pérdida de tiempo se mueve a otro transpiler cuando mis necesidades cambiaron.

  • Me gusta Transcrypt porque el javascript generado es realmente 'delgado y medio' y porque lo único que carga en el navegador es su código javascript generado, que es similar en tamaño a su código Python. También porque admite mapas de origen y porque me da una medida de control sobre el javascript generado. Y su uso me enseñó bastante sobre optimización.

Espero que ayude a alguien a ver cuál de estos podría ser bueno para su proyecto en particular.

fzzylogic
fuente
1
¿Estás seguro de que Brython es un transpilador? Estoy bastante seguro de que implementa un intérprete de Python en JavaScript. Si fuera un transpilador, no necesitaría empaquetarlo con su aplicación.
Carl Smith
@Carl Smith Un punto interesante, no lo había pensado así. Brython convierte el código python en javascript, pero dado que javascript no tiene un código de bytes estándar, tal vez se pueda ver el código de bytes generado como 'código de bytes' para el motor Brython.
fzzylogic
1
Me malentendiste. No creo que Brython transpile Python a JavaScript en absoluto. Simplemente implementa un intérprete de Python en JS, en lugar de C. Según su README de GitHub "Brython (Browser Python) es una implementación de Python 3 que se ejecuta en el navegador, con una interfaz para los elementos y eventos DOM".
Carl Smith
4
@jsbueno Actualmente, están disponibles semillas, randint, choice y random, que están pensados ​​solo como un punto de partida. De hecho, esperamos que alguien lo recoja y lo complete, al igual que se hizo para re, que ocupaba un lugar destacado en nuestra lista. No debería ser tan difícil. La cantidad de bibliotecas ha crecido pero las contribuciones son bienvenidas. Si bien el acento se mantendrá en el uso de bibliotecas JS, personalmente agradecería más bibliotecas estándar.
Jacques de Hooge
1
Una buena descripción. En general, lo que veo como la principal diferencia (que usted afirma pero no enfatiza) es que el objetivo de Brython es en realidad permitirle usar Python en el navegador, mientras que parece que el objetivo de Transcrypt es permitirle usar la sintaxis de Python para escribir JavaScript. Esto significa que Transcrypt está dispuesto a hacer cosas como la diferencia de veracidad que se desvían en un nivel básico de la semántica de Python, y también parece estar dirigida al código que aprovecha las bibliotecas de JavaScript; mientras que Brython intenta replicar Python lo más cerca posible con la idea de que harás todo en Python.
BrenBarn
12

He usado y me he comprometido a skulpt y pypyjs. Y los tres son muy diferentes, por lo que cualquier comparación es discutible si me preguntas.

Depende de lo que estés buscando, cuál tendrá más sentido.

PyPyJS

pypyjs es enorme, es un archivo javascript de 12 MB que contiene la máquina virtual pypy completa. Entonces, si desea que la implementación de Python esté completa, este es su bebé. Tiene un puente javascript que funciona realmente bien, pero no es una opción viable para escribir el código de su sitio web javascript en python. Sin embargo, te lo permitirá import compiler.

Está construido con emscripten y es más rápido que CPython, al ejecutar el punto de referencia de pystone.

Di una breve charla sobre pypyjs aquí están las diapositivas.

Skulpt

Es una herramienta de enseñanza (o se ha convertido en eso con el tiempo), compila su python en una máquina de estado emulando muy de cerca el compilador cpython. En esencia, es una implementación manuscrita del compilador de Python en javascript. Permite la ejecución asincrónica que le permite hacer:

while (True):
    print "hi"

Sin bloquear el navegador.

Skulpt es el único que admite continuaciones asincrónicas, le permite pausar la ejecución de Python mientras resuelve algo asincrónico que sucederá. Haciendo que esto funcione:

from time import sleep
sleep(1)

Skulpt corre a aproximadamente una décima parte de la velocidad de CPython, al comparar pystone.

Brython

Lo que menos sé sobre este tal vez @ olemis-lang pueda expandir este. Pero junto a la obvia diferencia de que Brython es py3 y los demás py2. Brython también es un transpilador.

Brython no ejecuta el benchmark pystone porque time.clock no está implementado, porque oficialmente es una función de hardware.

Albertjan
fuente
Los desarrolladores de PyPyJS han detenido el desarrollo. Además, el soporte de Python3 parece aún sin terminar. github.com/pypyjs/pypyjs/issues/213 y github.com/pypyjs/pypyjs/issues/172
Roland Pihlakas
No se mantiene, pero eso no significa que no funcione :) trinket.io/pypyjs pero mira este espacio, estoy bastante seguro de que algo volverá a surgir eventualmente. Además, no puede esperar que se mantenga el código abierto, a menos que lo haga usted mismo. :)
albertjan
Me parece que Trinket con Python 2 se ejecuta en el lado del navegador, mientras que Trinket con Python 3 (y numpy) se ejecuta en el lado del servidor. Todavía es impresionante que se las arreglen para tener un trazado visual renderizado en el navegador, a pesar de que el código se ejecuta en el lado del servidor. Sería muy útil saber cómo lo lograron. ¿Tienes alguna idea?
Roland Pihlakas
Trinket usa la biblioteca GlowScript (glowscript.org) que usa RapydScript-NG para transpilar Python a JavaScript y WebGL para producir animaciones 3D. Tanto la transpilación como la ejecución se realizan en el navegador. Aquí hay una descripción general de la arquitectura GlowScript
user1114907
11

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

Esta página compara a los tres candidatos. Brython emerge como un claro ganador.

A pesar de la 'ayuda' que explica que SO no es bueno para este tipo de pregunta, parece que en este caso es posible una respuesta concisa.

¿Quizás la gente se está apresurando demasiado?

Pi
fuente
5
La última vez que verifiqué brython no era una implementación completa de python. Tampoco está claro cómo se debe medir "mejor" o "cómo elegir entre estos". ¿El más rápido? Python no se usa principalmente para la velocidad. ¿Implementa la mayoría de funciones / bibliotecas? Es posible que haya módulos que nunca usaría en un navegador. ¿Es la sintaxis adicional (no compatible con cpython) para operaciones comunes (manipulación de árboles) un más o un menos? No creo que el desempeño en un punto de referencia sea tan significativo.
sinónimo
El punto de referencia de rendimiento es un factor importante cuando no es entre un 20% y un 40% más rápido, sino un 1000% de mejoras en algunas operaciones. Brython es una capa ligera sobre javascript, por lo que es diferente. Además, el proyecto es muy compatible con Python3 en estos días; lo que hace es incorporar algunas bibliotecas de Javascript maduras y conocidas en el proyecto según sea necesario, por ejemplo, para el manejo de enteros grandes.
jsbueno
7

En primer lugar, soy un committer de Brython. Sin embargo, intentaré ser lo más imparcial posible para hacer una evaluación objetiva.

La última vez que lo usé, Skulpt no admitía funciones como expresiones generadoras. Brython y PyPy.js lo hacen, por lo que, en mi humilde opinión, a nivel de función, los últimos son superiores.

Brython (en este momento) todavía está en progreso. Algunos módulos no se pueden importar (por ejemplo, xml.ElementTree ). Sin embargo, esta situación está comenzando a cambiar ya que estamos trabajando para ejecutar todo el conjunto de pruebas de CPython a pesar de lograr una compatibilidad total con los estándares (al menos cuando tiene sentido).

Brython también admite .vfs.js para acelerar las importaciones de módulos.

PyPy.js tiene una serie de características que se derivan directamente del hecho de que está impulsado por PyPy (compilación JIT, bien probada, ...) pero no estoy seguro de si es adecuado para ejecutarse en el navegador. Esto puede cambiar a medida que evoluciona el proyecto.

TODO: Intentaré complementar mi respuesta con puntos de referencia fiables.

Olemis Lang
fuente
8
Como comprometido con skulpt, puedo decirles que admite expresiones generadoras. :)
albertjan
6

No se menciona aquí RapydScript o RapydScript-NG. Producen código JavaScript muy eficiente, que se utiliza en GlowScript VPython (glowscript.org). Solía ​​usar el RapydScript original de Alex Tsepkov ( https://github.com/atsepkov/RapydScript ) pero recientemente cambié a RapydScript-NG de Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ). Recientemente ejecuté el punto de referencia de pystone en CPython, RapydScript y Brython, y puede ver los resultados aquí:

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

usuario1114907
fuente
¿Podría resumir los resultados?
Jay
1
El 18 de junio, Pierre Quentel dijo: "Está bien, existe un problema de rendimiento, pero las cosas están mejorando; la versión en la que estoy trabajando actualmente (3.2.7) ejecuta la prueba pystone 2.5 más rápido que la 3.2.6. Todavía es 15 veces más lento que CPython, pero en los primeros días era miles de veces más lento ".
user1114907
1
Ejecuté el punto de referencia de pitones usando el transpilador rapydscript-ng, y comparó 5 veces la velocidad de CPython en mi computadora con Windows 10, 600000 pitones / seg frente a 125000 pitones / seg. El factor de aproximadamente 5 veces la velocidad CPython para rapydscript-ng aumenta a aproximadamente 7 veces CPython si desactivo la sobrecarga del operador que se usa en GlowScript VPython, en el que, por ejemplo, a + b se convierte en un ["+"] (b) ; esto se hace para permitir una fácil manipulación de vectores 3D.
user1114907
No dije que el comentario de Quentel se refería a Brython.
user1114907
2
No he realizado más evaluaciones comparativas. Inicialmente cambié a RapydScript-NG cuando el desarrollo de RapydScript se detuvo. Luego, más tarde, cuando Alex Tsepkov volvió al desarrollo, tuve un intercambio con él en el que incluso él estuvo de acuerdo en que el proyecto NG de Kovid Goyal es más apropiado para mi uso particular en glowscript.org. Tsepkov quiere construir un lenguaje mixto Python / JavaScript para programadores web, mientras que Goyal enfatiza la aproximación de Python estándar y proporciona un buen soporte para compilar en el navegador, los cuales son clave para mi trabajo.
user1114907
4

Como nadie lo ha mencionado, pensé que valía la pena mencionar a Batavia, que implementa la máquina virtual Python para ejecutar códigos de bytes Python precompilados.

Lo acabo de probar y, aunque es un concepto interesante, todavía está en las primeras etapas ya que hay poca documentación.

Al final, dependerá de lo que intentes hacer. Elegí Transcrypt después de echarle un vistazo porque era más pragmático y de mejor rendimiento, también lanzado / mantenido más recientemente.

icarito
fuente
Skulpt todavía se mantiene y usa activamente por una base de usuarios bastante grande (varios cursos muy populares sobre cousera). Puede que no obtenga tanto lanzamientos como transcrypt, pero hay muchos más mantenedores, mantenedores que construyeron un producto en él. Entonces están en esto a largo plazo. :)
albertjan
3

Esta es una conferencia actualizada que compara todas las opciones disponibles en el mercado en este momento:

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

El orador es Russell Keith-Magee, un conocido desarrollador en el área.

Daian Gan
fuente