Python в браузере: Как выбрать между Brython, PyPy.js, Skulpt и Transcrypt?

Я очень рад видеть, что теперь можно кодировать Python в браузере. Это основные кандидаты (пожалуйста, добавьте все, что я мог упустить):

но как выбрать между ними? Единственное заметное отличие я вижу в том, что скульпт основана на Питоне 2, в то время как Brython базируется на В Python 3.

обратите внимание: это не просьба о рекомендации или мнения. Я ищу объективные факты, которые помогли бы сделать правильный выбор.

8 ответов


Это тоже может быть полезно: http://stromberg.dnsalias.org / ~strombrg/pybrowser/python-browser.html

Он сравнивает несколько технологий Python-in-the-browser.


вот некоторая информация о Brython vs Transcrypt (июль 2016, так как Transcrypt был добавлен в качестве опции по этому вопросу OP), собранная путем запуска проекта с Brython несколько месяцев назад и перехода на Transcrypt (завершен на прошлой неделе). Мне нравится Brython и Transcrypt, и я могу видеть использование для них обоих.

для людей, которые новички в этом, Brython и Transcrypt оба "транспилируют" Python вход в javascript (Edit: возможно, лучше рассматривать Brython как " Python реализация для браузера", потому что он не производит автономный javascript). Оба требуют синтаксиса Python 3. Brython включает в себя значительное количество стандартных библиотек Python и некоторые из них для работы с веб-связанными вещами, в то время как Transcrypt избегает этого по большей части и предлагает использовать библиотеки Javascript.

Brython (Github) можно сделать преобразование в браузере. Итак, вы пишете на python и brython.двигатель js преобразует его в JavaScript на лету при загрузке страницы. Это очень удобно, и гораздо быстрее, чем вы думаете. Однако brython.JS engine, который вам нужно включить в свои страницы, составляет около 500 кб. Кроме того, есть вопрос импорта стандартных библиотек, которые Brython обрабатывает, получая отдельные.JS-файлы с запросами XHR. Некоторые библиотеки уже скомпилированы в brython.js, поэтому не каждый импорт будет тянуть новые файлы, но если вы используете много импорта, все может замедлиться. Однако, есть способы обойти это. Я проверил вкладку "Сеть" в browser dev tools, чтобы узнать, какие файлы были извлечены при загрузке страницы, затем удалил все файлы, которые мой проект не использовал в копии папки brython src, и запустил сценарий, включенный в Brython (я думаю, что он находится на Brython/www/scripts/make_VFS.py) который компилирует все доступные библиотеки в один файл с именем py_VFS.js, на который вам также нужно ссылаться из вашего html. Нормально, он сделает один огромный файл 2MB+, но если вы удаляете вещи, которые вы не используете, это может быть совсем крошечным. Это означает, что вы должны тянуть в brython.js, py_VFS.js и ваш код python, и никаких дополнительных запросов XHR не потребуется.

Transcrypt (Github)С другой стороны, распространяется как пакет python 3 который вы можете использовать вручную или подключить к вашей цепочке инструментов, чтобы скомпилировать python на javascript заранее. Итак, с Transcrypt вы пишете на python, запускаете transcrypt против python, и он выплевывает javascript, на который вы можете ссылаться в своем проекте. Это больше похоже на традиционный компилятор также в том, что он предлагает некоторый контроль над выходом. Например, вы можете выбрать компиляцию в ES6 или ES5 или попросить его вывести sourcemaps (что во время отладки давайте браузер приведет вас непосредственно к соответствующему коду python, insead сгенерированного кода javascript.) Выход javascript Transcrypt довольно лаконичен (или, другими словами, это довольно и краткий.) В моем случае 150kB python преобразуется в 165kB unminified ES5 javascript. Для сравнения, версия Brython моего проекта использовала около 800Kb после преобразования.

тем не менее, получение преимуществ краткости транскриптов требует чтения документов немного (действительно немного). Например, с Transcrypt "правдивость" Python для структур данных, таких как dict, set и list, по умолчанию не включена, а глобальное включение ее не рекомендуется из-за потенциала проблемы производительности, связанные с проверкой типов. Для ясности: в CPython пустой дикт, набор или список имеет значение истины False, тогда как в Javascript он считается "истинным".. Пример:

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

есть по крайней мере три способа решить эту проблему:

  • используйте флаг-t при преобразовании python в javascript, например: $ transcrypt-t python.py (не рекомендуется, но, вероятно, не является проблемой, если вы не проверяете правдивость много раз во внутренних циклах производительности код..)
  • использовать __pragma__(tconv) или __pragma__(notconv) в вашем коде, чтобы сообщить компилятору transcrypt включить автоматическое преобразование в значения истины, подобные python, локально.
  • вместо того, чтобы проверять значение истины, избегайте проблемы вообще, просто проверяя len(myList) > 0... Может быть, это будет хорошо для большинства ситуаций, делает работу для моего легкого использования.

правильно, поэтому мой проект становился больше, и я хотел предварительно скомпилировать для повышения производительности, но нашел это трудно сделать с Brython (хотя это технически возможно, простой способ использовать онлайн редактор и нажмите кнопку javascript, чтобы увидеть вывод). Я сделал это и связался с сгенерированным javascript из проекта.html, но по какой-то причине это не сработало. Кроме того, мне трудно понять сообщения об ошибках от Brython, поэтому я не знал, с чего начать после этого шага. Кроме того, большой размер выведенного кода и размер двигателя brython начали ошибаться мне. Поэтому я решил поближе взглянуть на Transcrypt, который сначала казался более высоким, потому что я предпочитаю тупые инструкции, которые говорят мне, как начать немедленно (они были добавлены).

главное, чтобы он был настроен после установки Python3.5 было 1) Используйте venv (это похоже на новую встроенную версию virtualenv, которая использует меньше места для каждого проекта), чтобы настроить python3.5 папка проекта (просто введите: python3.5-m venv foldername -решение для ubuntu с проблемами пакета для 3.5). Это делает "foldername" с подпапкой bin среди прочего. 2) установите пакет Transcrypt python с помощью pip ('foldername/bin/pip install transcrypt'), который устанавливает его в foldername/lib/python3.5 / site-packages/transcrypt. 3) "активировать" текущий терминал, если вы не хотите вводить полный путь к foldername/bin/python3.5 каждый раз. Активировать, набрав: 'source foldername / bin / activate' 4) Начните писать код и компилировать его в JavaScript для тестирования. Компилируйте из папки, в которой вы пишете свой код. Например, я использовал foldername/www / project. Итак, CD в эту папку и запустите: 'transcrypt-b your_python_script.py". Это помещает вывод в подпапку с именем __javascript__. Затем вы можете ссылаться на выведенный javascript из своего html.

основные вопросы перемещения по

у меня довольно простые потребности, поэтому ваш пробег может отличаться.

  • вам нужно замените стандартные библиотеки brython или python на JavaScript. Так, например, "импорт json" предоставляется Brython, но под Transcrypt вы можете использовать JavaScript lib или просто использовать JSON.parse / JSON.stringify непосредственно в коде Python. Чтобы включить мини-версию библиотеки javascript непосредственно в код python, используйте этот формат (обратите внимание на тройные кавычки):

    __pragma__ ('js', '{}', ''' // javascript code ''')

  • специфические функции html Brython не работают с Transcrypt, очевидно. Просто используйте обычные способы javascript. Примеры: 1) в Brython вы могли бы сослаться на определенный HTML-тег, используя " document ['id']", но с Transcrypt вы бы использовали " document.getElementById ('id') (так же, как вы делаете это из javascript). 2) вы не можете удалить узел с "del nodeName" (bcs, который является функцией brython). Используйте что-то вроде 'node.parentNode.removeChild (узел)'. 3) заменить все функции brython дом с альтернативы на JavaScript. например, class_name = className; text = текстового содержимого; формат HTML = innerHTML будет; родитель = parentNode; дети = childNodes и т. д. Я думаю, если вам нужно что-то, что содержит альтернативы, требуемые некоторыми старыми браузерами, для этого есть библиотеки javascript. 4) set_timeout Brython заменяется javascripts setTimeout 5) HTML-теги Brython, такие как BR (), должны быть заменены с помощью обычных способов javascript, а также переделывать любые места, которые вы использовали, это

  • Я закончил перемещение проекта линии 2700 на прошлой неделе, когда Transcrypt не поддерживал несколько незначительных вещей (хотя их было достаточно легко заменить наполнителями), это были 1) str.ул. Нижняя,.сплит (ул.split присутствует, но, похоже, javascript split, который работает по-разному с версией python, на поведение которой я полагался), 2) round (это, похоже, поддерживается в версии dev сейчас) и 3) isinstance не работал на str, int и float, только на dict, list и set. 4) Еще одно отличие от Brython я заметил, что если я вытаскиваю JSON-представление dict, мне нужно сделать это, используя " myDict = dict(data)", тогда как brython был доволен "myDict = data". Но это может быть связано с чем-то в Brython по формат JSON.нагрузки, которые Я заменил непосредственно на JSON.разбор. 5) также без специфически позволенной перегрузки оператора Transcrypts (используя переключатель-o для глобального, или __pragma__('opov') для local), вы не можете делать такие вещи, как операции set, используя перегруженный формат, но должны использовать соответствующие функции. Е. Г.

    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) Кроме того, вы не можете повторять дикты по умолчанию, используя "for i in dict:", не включив это (cmd line-i или __pragma__('iconv'), но вы можете избежать необходимости включать его просто используя член keys (), например:

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

подводя итоги

  • мне нравится Brython, потому что с ним легко работать и тестировать ваш код (просто F5). Это ближе к истинному python, потому что большинство стандартных lib есть. Мне не нравится включать механизм транспиляции (Edit: или можно просмотреть его как Python VM) в браузере и большой размер выводимого javascript. Если бы мне пришлось что-то делать (но все еще используя Brython), я бы использовал методы javascript для управления DOM из brython (что вы можете сделать..), вместо того, чтобы так сильно полагаться на методы brython, потому что это потерянное время переходит к другому транспилеру, когда мои потребности изменились.

  • мне нравится Transcrypt, потому что выводимый javascript действительно "тощий и средний", и потому что единственное, что вы загружаете в браузер, - это ваш сгенерированный код javascript, который похож по размеру на ваш код python. И потому, что он поддерживает sourcemaps и потому, что это дает мне меру контроля над выводимым javascript. И использование его научило меня довольно много об оптимизации.

надеюсь, что это поможет кому-то увидеть, какой из них может быть хорош для их конкретного проекта.


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

эта страница проверяет трех кандидатов. Brython выступает как явный победитель.

несмотря на "помощь", объясняющую, что S. O. не подходит для такого рода вопросов, кажется, что краткий ответ в этом случае возможен.

может быть, люди слишком торопишься?


я использовал и совершил skulpt, а также pypyjs. И все они очень разные, что любое сравнение спорно, если вы спросите меня.

Это зависит от того, что вы ищете, который будет иметь смысл.

PyPyJS

pypyjs огромен, это файл javascript 12MB, который содержит всю виртуальную машину pypy. Поэтому, если вы хотите полноты реализации python, это ваш ребенок. Он имеет мост javascript, который работает очень хорошо, но это не жизнеспособный вариант для написания кода веб-сайта javascript в python. Однако это позволит вам import compiler.

Он построен с emscripten и быстрее затем CPython, при запуске теста pystone.

Я дал короткий разговор о pypyjs здесь слайды.

Skulpt

является инструментом обучения (или он превратился в это с течением времени), он компилирует ваш python в государственную машину, очень близко эмулируя cpython компилятор. По своей сути это рукописная реализация компилятора python в javascript. Он позволяет асинхронное выполнение, которое позволяет делать:

while (True):
    print "hi"

без блокировки браузера.

Skulpt-единственный, который поддерживает асинхронные продолжения,он позволяет приостановить выполнение python, пока он разрешает асинхронную вещь. Делая эту работу:

from time import sleep
sleep(1)

Skulpt бежит на около десятой части скорости CPython, когда сравнение pystone.

Brython

Я знаю меньше всего об этом, возможно, @olemis-lang может расширить этот. Но рядом с очевидной разницей, что Brython-это py3, а другие py2. Brython также transpiler.

Brython не запускает тест pystone, потому что время.часы не реализованы, потому что официально это аппаратная функция.


в первую очередь я Brython коммиттер . Тем не менее я постараюсь быть максимально беспристрастным ради объективной оценки .

в последний раз, когда я использовал его, Skulpt не поддерживал такие функции, как выражения генератора . Brython и PyPy.js делают это, поэтому на уровне функций IMHO более поздние превосходят .

Brython (в это время) все еще работает . Некоторые модули не могут быть импортированы (например,XML-файле.ElementTree ) . Тем не менее это ситуация начинает чтобы изменить, так как мы работаем над запуском всего набора тестов CPython, несмотря на достижение полной совместимости со стандартами (по крайней мере, когда это имеет смысл) .

Brython также поддерживает .ВФС.js для ускорения импорта модулей .

PyPy.js имеет ряд характеристик, которые следуют прямо из того факта, что он питается от PyPy (JIT compilation , хорошо протестирован , ...) но я не уверен, подходит ли он для работы в браузере . Это может измениться по мере развития проекта .

TODO :я постараюсь дополнить свой ответ надежными критериями.


здесь не упоминается RapydScript или RapydScript-NG. Они производят очень эффективный код JavaScript, который используется в GlowScript VPython (glowscript.org). Я использовал оригинальный RapydScript Алексей Цепков (https://github.com/atsepkov/RapydScript), но недавно перешла на RapydScript-НГ Kovid Goyal категория (https://github.com/kovidgoyal/rapydscript-ng). Недавно я провел pystone тест на CPython, RapydScript, и Brython, и вы можете увидеть результаты здесь:

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


поскольку никто не упомянул об этом, я подумал, что стоит упомянуть Батавия который реализует виртуальную машину Python для запуска предварительно скомпилированного байт-кода Python.

Я просто попробовал, и, хотя это интересная концепция, она все еще находится на ранних стадиях, так как документации мало.

в итоге это будет зависеть от того, что вы пытаетесь сделать. Я выбрал Transcrypt после того, как посмотрел, потому что это было более прагматично и лучше performant, также недавно выпущенный / поддерживаемый.


Это обновленная конференции, которая сравнивает все доступные варианты на рынке прямо сейчас:

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

спикер-Рассел Кейт-Мэги, который является известным разработчиком в этой области.