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:
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:
- 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.
- 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.
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'
- 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)
a.union(b)
a.intersection(b)
a.symmetric_difference(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():
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.