Estou muito animado em ver que agora é possível codificar Python no navegador. Estes são os principais candidatos (por favor, adicione qualquer um que eu tenha esquecido):
Mas como escolher entre eles? A única diferença óbvia que posso ver é que Skulpt é baseado em Python 2, enquanto Brython é baseado em Python 3.
Observação: este não é um pedido de recomendações ou opiniões. Estou buscando fatos objetivos que informariam uma escolha educada.
Respostas:
Executar Python no navegador é um artigo muito bom e atualizado (a partir de 2019) que compara Brython, Skulpt, PyPy.js, Transcrypt, Pyodide, Batavia . Eu recomendo a leitura.
Um bom resumo pode ser visto nas fotos a seguir.
fonte
Aqui estão algumas informações sobre Brython vs Transcrypt (julho de 2016, uma vez que Transcrypt foi adicionado como uma opção nesta questão pelo OP), recolhidas iniciando um projeto com Brython alguns meses atrás e movendo para Transcrypt (mudança concluída na semana passada). Eu gosto de Brython e Transcrypt e posso ver os usos de ambos.
Para as pessoas que são novas nisso, Brython e Transcrypt ambos 'transpilar' a entrada python para javascript (Editar: talvez seja melhor ver Brython como uma 'uma implementação Python para o navegador' porque não produz javascript autônomo). Ambos requerem sintaxe Python 3. Brython inclui um número substancial de bibliotecas padrão Python e algumas das suas próprias para lidar com coisas relacionadas à web, enquanto o Transcrypt evita isso na maior parte e sugere o uso de bibliotecas Javascript.
Brython ( Github) pode fazer a conversão no navegador. Então, você escreve em python e o mecanismo brython.js o converte para javascript na hora quando a página é carregada. Isso é muito conveniente e muito mais rápido do que você imagina. No entanto, o mecanismo brython.js que você precisa incluir em suas páginas tem cerca de 500 KB. Além disso, há a questão da importação de bibliotecas padrão, que Brython lida buscando arquivos .js separados com solicitações XHR. Algumas libs já estão compiladas em brython.js, então nem toda importação irá puxar novos arquivos, mas se você usar muitas importações, as coisas podem ficar lentas. No entanto, existem maneiras de contornar isso. O que fiz foi verificar a guia de rede nas ferramentas de desenvolvimento do navegador para ver quais arquivos estavam sendo puxados quando a página foi carregada e, em seguida, excluir todos os arquivos que meu projeto não estava usando em uma cópia da pasta Brython src, e execute o script incluído no Brython (acho que está em Brython / www / scripts / make_VFS.py) que compila todas as libs disponíveis em um arquivo chamado py_VFS.js que você também precisa vincular a partir do seu html. Normalmente, ele formará um arquivo enorme de 2 MB +, mas se você excluir as coisas que não está usando, pode ser bem pequeno. Fazendo dessa maneira, você só precisa obter brython.js, py_VFS.js e seu código Python, e nenhuma solicitação XHR adicional será necessária.
Transcrypt ( Github ), por outro lado, é distribuído como um pacote python 3que você pode usar manualmente ou conectar em seu conjunto de ferramentas para compilar python para javascript com antecedência. Assim, com o Transcrypt, você escreve em python, executa o transcrypt no python e ele emite javascript para o qual você pode criar um link em seu projeto. É mais parecido com um compilador tradicional também porque oferece algum controle sobre a saída. Por exemplo, você pode escolher compilar para ES6 ou ES5, ou pedir para gerar mapas de origem (que durante a depuração permite que o navegador o leve diretamente para o código python correspondente, em vez do código javascript gerado.) A saída javascript do Transcrypt é muito concisa ( ou dito de outra forma, é bonito e conciso). No meu caso, 150kB de python são convertidos em 165kB de javascript ES5 não minimizado. A título de comparação, a versão Brython do meu projeto usou cerca de 800Kb após a conversão.
No entanto, para obter os benefícios da concisão do Transcrypts, é necessário ler os documentos um pouco (na verdade, apenas um pouco). Por exemplo, com o Transcrypt, a 'veracidade' do Python para estruturas de dados como dict, set e list não está habilitada por padrão e a habilitação global é desencorajada devido a possíveis problemas de desempenho relacionados à verificação de tipos. Para maior clareza: no CPython, um dicionário vazio, conjunto ou lista tem valor verdade False, enquanto em Javascript é considerado 'verdadeiro'. Exemplo:
myList = [] if myList: # False in CPython bcs it's empty, true in javascript bcs it exists # do some things.
Existem pelo menos três maneiras de resolver isso:
__pragma__(tconv)
ou__pragma__(notconv)
em seu código para dizer ao compilador transcrypt para ativar a conversão automática para valores verdade do tipo python localmente.Certo, então meu projeto estava ficando maior e eu queria pré-compilar para um ganho de desempenho, mas achei difícil fazer isso com Brython (embora seja tecnicamente possível, uma maneira fácil de usar o editor online e clicar no botão javascript para ver a saída). Eu fiz isso e vinculei ao javascript gerado em project.html, mas não funcionou por algum motivo. Além disso, acho difícil entender as mensagens de erro de Brython, então não sabia por onde começar depois que essa etapa falhou. Além disso, o grande tamanho do código gerado e o tamanho do mecanismo brython estavam começando a me incomodar. Então decidi dar uma olhada mais de perto no Transcrypt, que a princípio parecia ter um grau mais alto porque eu prefiro instruções simplificadas que me dizem como começar imediatamente (elas já foram adicionadas).
A principal coisa para configurá-lo após a instalação do Python3.5 foi:
activate
o terminal atual se você não quiser ter que digitar o caminho completo para nome da pasta / bin / python3.5 todas as vezes. Ative digitando: 'nome da pasta de origem / bin / ativar'__javascript__
. Você pode então criar um link para o javascript gerado no seu html.Principais problemas em andamento
Tenho necessidades bastante simples, então sua milhagem pode variar.
Você precisa substituir as bibliotecas padrão do brython ou python por bibliotecas javascript. Portanto, por exemplo, 'import json' é fornecido por Brython, mas em Transcrypt você pode usar uma lib javascript ou apenas usar JSON.parse / JSON.stringify diretamente em seu código Python. Para incluir uma versão reduzida de uma biblioteca javascript diretamente em seu código python, use este formato (observe as aspas triplas):
__pragma__ ('js', '{}', ''' // javascript code ''')
As funções específicas de html de Brython não funcionam com Transcrypt obviamente. Basta usar as formas normais de javascript. Exemplos: 1) em Brython, você pode ter se referido a uma tag HTML específica usando 'document [' id ']', mas com Transcrypt você usaria 'document.getElementById (' id ') (que é a mesma maneira que você faz de javascript). 2) Você não pode excluir um nó com 'del nodeName' (bcs que é uma função brython). Use algo como 'node.parentNode.removeChild (node)'. 3) substituir todas as funções DOM do brython pelas alternativas javascript. por exemplo, class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes etc. Acho que se você precisa de algo que contenha alternativas exigidas por alguns navegadores mais antigos, existem bibliotecas javascript para isso. 4) O set_timeout de Brython é substituído por javascripts setTimeout 5) As tags html de Brython, como BR (), precisam ser substituídas usando as formas normais de javascript, bem como refazer quaisquer lugares que você usou em sua <= sintaxe de manipulação de dom. Injete a marcação de texto simples como innerHTML ou crie os elementos usando a sintaxe javascript e, em seguida, anexe-os usando a sintaxe javascript DOM normal. Também percebi que para as caixas de seleção o brython usa "if checkbox = 'checks':" mas a Transcrypt está satisfeita com "if checkbox:" .. Injete a marcação de texto simples como innerHTML ou crie os elementos usando a sintaxe javascript e, em seguida, anexe-os usando a sintaxe javascript DOM normal. Também percebi que para as caixas de seleção o brython usa "if checkbox = 'checks':" mas a Transcrypt está satisfeita com "if checkbox:" .. Injete a marcação de texto simples como innerHTML ou crie os elementos usando a sintaxe javascript e, em seguida, anexe-os usando a sintaxe javascript DOM normal. Também percebi que para as caixas de seleção o brython usa "if checkbox = 'checks':" mas a Transcrypt está satisfeita com "if checkbox:" ..
Terminei de mover um projeto de 2700 linhas na semana passada, momento em que o Transcrypt não tinha suporte para algumas coisas menores (embora fossem fáceis de substituir por enchimentos), que eram 1) str.lower, str.split (str. a divisão está presente, mas parece ser a divisão do javascript, que funciona de maneira diferente da versão python, cujo comportamento eu estava contando), 2) round (parece ser compatível na versão dev agora) e 3) isinstance didn 't trabalhar em str, int e float, apenas em dict, list e set. 4) Outra diferença de Brython que notei é que se eu puxar uma representação JSON de um dicionário, preciso fazer isso usando 'myDict = dict (data)', enquanto o brython fica feliz com 'myDict = data'. Mas isso pode estar relacionado a algo em json.loads de Brython, que substituí diretamente por JSON.parse.
__pragma__('opov')
para local), você não pode fazer coisas como definir operações usando o formato sobrecarregado, mas precisa usar as funções correspondentes. Por exemploa = 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) Além disso, você não pode iterar dicts por padrão usando 'for i in dict:', sem habilitar isso (cmd line -i ou
__pragma__('iconv')
, mas você pode evitar ter que habilitá-lo usando apenas o membro keys (), por exemplo:for key, value in dict.items(): # do things for each key and value..
Para resumir
Eu gosto do Brython porque é fácil de começar e testar seu código (apenas F5). É mais próximo do verdadeiro python porque a maior parte da biblioteca padrão está lá. Não gosto de ter que incluir o mecanismo de transpilação (Editar: Ou alguém pode vê-lo como uma VM python) no navegador e o grande tamanho de javascript de saída. Se eu tivesse que refazer as coisas (mas ainda usando Brython), eu teria usado métodos javascript para manipular o DOM do brython (o que você pode fazer ..), em vez de depender tanto dos métodos do brython porque isso é perda de tempo em para outro transpiler quando minhas necessidades mudassem.
Eu gosto de Transcrypt porque o javascript gerado é realmente 'enxuto' e porque a única coisa que você carrega do lado do navegador é o código javascript gerado, que é semelhante em tamanho ao seu código python. Também porque ele oferece suporte a mapas de fontes e porque me dá uma medida de controle sobre o javascript enviado. E usá-lo me ensinou um pouco sobre otimização.
Espero que ajude alguém a ver o que pode ser bom para seu projeto específico.
fonte
https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/
Esta página avalia os três candidatos. Brython surge como um vencedor claro.
Apesar da 'ajuda' explicar que o SO não é bom para esse tipo de pergunta, parece que uma resposta concisa é possível neste caso.
Talvez as pessoas estejam sendo muito precipitadas?
fonte
Eu usei e me comprometi a skulpt tão bem quanto pypyjs. E são todos três muito diferentes que qualquer comparação é discutível se você me perguntar.
Depende do que você está procurando, o que fará mais sentido.
PyPyJS
O pypyjs é enorme, é um arquivo javascript de 12 MB que contém toda a máquina virtual pypy. Portanto, se você deseja que a implementação do Python seja completa, este é o seu bebê. Ele tem uma ponte javascript que funciona muito bem, mas não é uma opção viável para escrever o código do seu site javascript em python. No entanto, vai deixar você
import compiler
.Ele é construído com emscripten e é mais rápido que o CPython, ao executar o benchmark pystone.
Eu dei uma pequena palestra sobre pypyjs aqui estão os slides.
Skulpt
É uma ferramenta de ensino (ou evoluiu para isso ao longo do tempo), ele compila seu python em uma máquina de estado emulando muito de perto o compilador cpython. Em seu núcleo, é uma implementação escrita à mão do compilador python em javascript. Ele permite a execução assíncrona que permite fazer:
while (True): print "hi"
Sem travar o navegador.
Skulpt é o único que suporta continuações assíncronas, ele permite que você pause a execução de python enquanto ele resolve alguma coisa assíncrona para acontecer. Fazendo isso funcionar:
from time import sleep sleep(1)
Skulpt funciona a cerca de um décimo da velocidade do CPython, ao comparar a pystone.
Brython
Eu sei menos sobre este, talvez @olemis-lang possa expandir este. Mas, além da diferença óbvia, Brython é py3 e os outros py2. Brython também é um transpiler.
Brython não executa o benchmark pystone porque time.clock não está implementado, porque oficialmente é uma função de hardware.
fonte
Em primeiro lugar, sou um committer Brython. Mesmo assim, tentarei ser o mais imparcial possível para fazer uma avaliação objetiva.
A última vez que o usei, o Skulpt não suportava recursos como expressões geradoras. Brython e PyPy.js fazem isso, portanto, no nível de recurso IMHO, os últimos são superiores.
Brython (neste momento) ainda está em andamento. Alguns módulos não podem ser importados (por exemplo, xml.ElementTree ). No entanto, esta situação está começando a mudar, uma vez que estamos trabalhando para executar todo o conjunto de testes do CPython, apesar de obter compatibilidade total com os padrões (pelo menos quando faz sentido).
Brython também oferece suporte a .vfs.js para acelerar a importação de módulos.
PyPy.js tem uma série de características que decorrem diretamente do fato de ser alimentado por PyPy (compilação JIT, bem testada, ...) mas não tenho certeza se é adequado para execução no navegador. Isso pode mudar conforme o projeto evolui.
TODO: Vou tentar complementar minha resposta com benchmarks confiáveis.
fonte
Não mencionado aqui é RapydScript ou RapydScript-NG. Eles produzem código JavaScript muito eficiente, que é usado no GlowScript VPython (glowscript.org). Eu costumava usar o RapydScript original de Alex Tsepkov ( https://github.com/atsepkov/RapydScript ), mas recentemente mudei para RapydScript-NG de Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ). Recentemente, executei o benchmark pystone em CPython, RapydScript e Brython, e você pode ver os resultados aqui:
https://groups.google.com/forum/?fromgroups&hl=en#!topic/brython/20hAC9L3ayE
fonte
Como ninguém mencionou, achei que valeria a pena mencionar o Batavia, que implementa a máquina virtual Python para executar bytecode Python pré-compilado.
Acabei de experimentar e, embora seja um conceito interessante, ainda está nos estágios iniciais, pois há pouca documentação.
No final, vai depender do que você está tentando fazer. Escolhi Transcrypt depois de dar uma olhada porque era mais pragmático e de melhor desempenho, também lançado / mantido mais recentemente.
fonte
Esta é uma conferência atualizada que compara todas as opções disponíveis no mercado agora:
https://www.youtube.com/watch?v=2XSeNQyPlTY
O palestrante é Russel Keith-Magee, um desenvolvedor conhecido na área.
fonte