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:
Existem pelo menos três maneiras de resolver isso:
- Use a sinalização -t ao converter python em javascript, por exemplo: $ transcrypt -t python.py (não recomendado, mas provavelmente não é um problema, a menos que você verifique a veracidade muitas vezes em loops internos de código sensível ao desempenho.)
- Use
__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.
- Em vez de verificar o valor verdade, evite o problema completamente apenas verificando len (myList)> 0 ... Talvez isso seja adequado para a maioria das situações, faz o trabalho para meu uso de luz.
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:
- Use o venv (é como uma nova versão integrada do virtualenv que usa menos espaço para cada projeto) para configurar uma pasta de projeto python3.5 (basta digitar: python3.5 -m venv foldername - solução alternativa para ubuntu com problemas de pacote para 3.5 ) Isso torna 'foldername' com uma subpasta bin entre outras coisas.
- Instale o pacote Transcrypt python com pip ('foldername / bin / pip install transcrypt'), que o instala em foldername / lib / python3.5 / site-packages / transcrypt.
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'
- Comece escrevendo o código e compilando-o em javascript para teste. Compile de dentro da pasta em que você escreveu seu código. Por exemplo, usei foldername / www / project. Então coloque o CD nessa pasta e execute: 'transcrypt -b your_python_script.py'. Isso coloca a saída em uma subpasta chamada
__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 exemplo
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(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():
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.