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.
Respuestas:
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.
fuente
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:
__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.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:
activate
la 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'__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.eja = 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.
fuente
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.
fuente
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?
fuente
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.
fuente
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
fuente
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.
fuente
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.
fuente