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

89

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

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

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

Число Пи
источник
6
Просить нас порекомендовать лучшую библиотеку для чего-либо - это один из случаев, когда в справке явно объясняется, что StackOverflow не подходит. Это отличный вопрос, но не для формата этого сайта; вы, вероятно, хотите что-то основанное на обсуждениях, например список рассылки или форум.
abarnert
2
Transcrypt ( transcrypt.org ) компилируется из большого подмножества python3.5 inc. множественное наследование, генерирует быстрый (запоминание вызовов) небольшой читаемый код, поддерживает многоуровневые исходные карты и может использовать любую библиотеку JS без адаптации. Отказ от ответственности: я написал это.
Жак де Хоге,
1
Привет, fzzylogic, я добавил тег, так что теперь люди могут задавать вопросы о SO, используя его. Заменил на него тег JS, потому что он наименее вероятен для поиска, если вы предпочитаете использовать Python в браузере.
Жак де Хоге,
1
Я написал своего рода учебник по Transcrypt для новичков. Вы можете посмотреть его на github.com/bunkahle/Transcrypt-Examples/blob/master/alerts/… и github.com/bunkahle/Transcrypt-Examples/blob/master/cookies/…
bunkus
1
В удаленном ответе dstromberg с 27 отзывами есть хорошая ссылка для сравнения: stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html
Cees Timmerman,

Ответы:

26

Запуск Python в браузере - действительно хорошая и актуальная (по состоянию на 2019 год) статья, в которой сравниваются Brython, Skulpt, PyPy.js, Transcrypt, Pyodide, Batavia . Я очень рекомендую это прочитать.

Хорошее резюме можно увидеть на следующих картинках.

введите описание изображения здесь

введите описание изображения здесь

laike9m
источник
61

Вот некоторая информация о 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, который вам нужно включить на свои страницы, составляет около 500 КБ. Кроме того, существует вопрос импорта стандартных библиотек, который Brython обрабатывает, получая отдельные файлы .js с запросами XHR. Некоторые библиотеки уже скомпилированы в brython.js, поэтому не каждый импорт будет включать новые файлы, но если вы используете много операций импорта, все может замедлиться. Однако есть способы обойти это. Что я сделал, так это проверил вкладку сети в инструментах разработчика браузера, чтобы увидеть, какие файлы были загружены при загрузке страницы, а затем удалил все файлы, которые мой проект не использовал в копии папки Brython src, и запустите сценарий, включенный в Brython (я думаю, что он находится в Brython / www / scripts / make_VFS.py), который компилирует все доступные библиотеки в один файл с именем py_VFS.js, на который вам также нужно ссылаться из вашего html. Обычно получается один огромный файл размером 2 МБ +, но если вы удалите то, что не используете, он может стать совсем маленьким. Это означает, что вам нужно использовать только brython.js, py_VFS.js и ваш код Python, и никаких дополнительных запросов XHR не потребуется.

Transcrypt ( Github ), с другой стороны, распространяется как пакет python 3.которые вы можете использовать вручную или подключиться к своей инструментальной цепочке, чтобы заранее скомпилировать python в javascript. Итак, с Transcrypt вы пишете на python, запускаете transcrypt против python, и он выплевывает javascript, на который вы можете ссылаться в своем проекте. Он больше похож на традиционный компилятор тем, что предлагает некоторый контроль над выводом. Например, вы можете выбрать компиляцию в ES6 или ES5 или попросить его вывести исходные карты (чтобы во время отладки браузер перенаправлял вас прямо к соответствующему коду Python, вместо сгенерированного кода javascript). Вывод Transcrypt на javascript довольно краток ( или, другими словами, красиво и лаконично). В моем случае 150 КБ Python преобразуются в 165 КБ неминифицированного JavaScript ES5. Для сравнения, версия моего проекта на Brython использовала после преобразования около 800 КБ.

Однако для того, чтобы воспользоваться преимуществами краткости Transcrypts, необходимо немного прочитать документацию (на самом деле совсем немного). Например, с Transcrypt «правдивость» Python для таких структур данных, как dict, set и list, не включена по умолчанию, а ее глобальное включение не рекомендуется из-за потенциальных проблем с производительностью, связанных с проверкой типов. Для ясности: в CPython пустой dict, set или list имеет истинное значение 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)в своем коде, чтобы указать компилятору транскрипции включить автоматическое преобразование в значения истинности, подобные Python, локально.
  • Вместо того, чтобы проверять значение истинности, вообще избегайте проблемы, просто проверяя len (myList)> 0 ... Может быть, это будет хорошо для большинства ситуаций, подходит для моего легкого использования.

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

Главное, что нужно было настроить после установки Python3.5:

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

Основные проблемы переходят

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

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

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
    
  • Очевидно, что специфические функции Brython для html не работают с Transcrypt. Просто используйте обычные способы javascript. Примеры: 1) в Brython вы могли бы сослаться на конкретный HTML-тег, используя 'document [' id ']', но с Transcrypt вы бы использовали 'document.getElementById (' id ') (как и вы это из javascript). 2) Вы не можете удалить узел с помощью 'del nodeName' (bcs, это функция brython). Используйте что-то вроде node.parentNode.removeChild (node). 3) заменить все функции DOM brython на альтернативы javascript. например class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes и т. д. Я думаю, если вам нужно что-то, что содержит альтернативы, требуемые некоторыми старыми браузерами, для этого есть библиотеки javascript. 4) set_timeout Brython заменен на javascripts setTimeout 5) HTML-теги Brython, такие как BR (), необходимо заменить обычными способами javascript, а также повторить все места, где вы использовали синтаксис манипуляции с <= dom. Либо введите разметку обычного текста как innerHTML, либо создайте элементы, используя синтаксис javascript, а затем прикрепите их, используя обычный синтаксис DOM javascript. Я также заметил, что для флажков brython использует «if checkbox = 'checked':», но Transcrypt доволен «if checkbox:» .. Либо введите разметку обычного текста как innerHTML, либо создайте элементы, используя синтаксис javascript, а затем прикрепите их, используя обычный синтаксис DOM javascript. Я также заметил, что для флажков brython использует «if checkbox = 'checked':», но Transcrypt доволен «if checkbox:» .. Либо введите разметку обычного текста как innerHTML, либо создайте элементы, используя синтаксис javascript, а затем прикрепите их, используя обычный синтаксис DOM javascript. Я также заметил, что для флажков brython использует «if checkbox = 'checked':», но Transcrypt доволен «if checkbox:» ..

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

    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) Кроме того, вы не можете перебирать dicts по умолчанию, используя '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). Это ближе к истинному питону, потому что там большая часть стандартной библиотеки. Мне не нравится включать движок транспиляции (Edit: или можно рассматривать его как виртуальную машину python) в браузере и большой размер выводимого javascript. Если бы мне пришлось что-то делать (но все еще используя Brython), я бы использовал методы javascript для управления DOM из brython (что вы можете сделать ..) вместо того, чтобы так сильно полагаться на методы brython, потому что это трата времени на перемещение на другой транспайлер, когда мои потребности изменились.

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

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

fzzylogic
источник
1
Вы уверены, что Brython - транспиллер? Я почти уверен, что он реализует интерпретатор Python в JavaScript. Если бы это был транспилятор, вам не нужно было бы связывать его со своим приложением.
Карл Смит,
@Carl Smith Интересный момент, я не думал об этом так. Brython преобразует код python в javascript, но, поскольку javascript не имеет стандартного байт-кода, возможно, можно было бы рассматривать сгенерированный javascript как «байт-код» для движка Brython.
fzzylogic
1
Ты не понял меня. Я не думаю, что Brython вообще переводит Python на JavaScript. Он просто реализует интерпретатор Python на JS вместо C. Согласно их README на GitHub, «Brython (Browser Python) - это реализация Python 3, работающая в браузере, с интерфейсом для элементов и событий DOM».
Карл Смит
4
@jsbueno В настоящее время доступны seed, randint, selection и random, которые предназначены только как отправная точка. На самом деле мы надеемся, что кто-то подберет его и завершит, как это было сделано для re, которое было в самом верху нашего списка. Не должно быть так сложно. Количество библиотек увеличилось, но взносы очень приветствуются. Хотя акцент будет по-прежнему на использовании JS-библиотек, я лично приветствовал бы больше стандартных библиотек.
Jacques de Hooge,
1
Хороший обзор. В целом то, что я считаю основным отличием (которое вы указываете, но не подчеркиваете), заключается в том, что цель Brython на самом деле состоит в том, чтобы позволить вам использовать Python в браузере, тогда как, похоже, цель Transcrypt - позволить вам использовать синтаксис Python для написания JavaScript. Это означает, что Transcrypt хочет делать такие вещи, как различие в правдивости, которые на базовом уровне отклоняются от семантики Python, а также, похоже, нацелены на код, использующий библиотеки JavaScript; тогда как Brython пытается максимально точно воспроизвести Python с идеей, что вы будете делать все на Python.
BrenBarn
12

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

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

PyPyJS

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

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

Я кратко рассказал о pypyjs, вот слайды.

Скульпт

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

while (True):
    print "hi"

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

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

from time import sleep
sleep(1)

По сравнению с pystone, Skulpt работает примерно в десять раз быстрее, чем CPython.

бритт

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

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

Альбертьян
источник
Разработчики PyPyJS остановили разработку. Также кажется, что поддержка Python3 еще не завершена. github.com/pyjs/pyjs/issues/213 и github.com/pyjs/pyjs/issues/172
Роланд Пихлакас
Он не поддерживается, но это не значит, что он не работает :) trinket.io/pypyjs, но следите за этим пространством, я почти уверен, что в конце концов что-то снова всплывет. Также вы не можете рассчитывать на поддержку открытого исходного кода, если не сделаете это сами. :)
albertjan
Мне кажется, что Trinket с Python 2 работает на стороне браузера, тогда как Trinket с Python 3 (и numpy) работает на стороне сервера. По-прежнему впечатляет то, что им удается отображать визуальные построения в браузере, хотя код выполняется на стороне сервера. Было бы очень полезно узнать, как им это удалось. Есть ли у вас какие-либо идеи?
Роланд Пихлакас
Trinket использует библиотеку GlowScript (glowscript.org), которая использует RapydScript-NG для преобразования Python в JavaScript и WebGL для создания 3D-анимации. И транспиляция, и выполнение выполняются в браузере. Вот обзор архитектуры GlowScript
user1114907,
11

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

На этой странице сравниваются три кандидата. Брайтон - явный победитель.

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

Может, люди поторопятся?

Число Пи
источник
5
В прошлый раз, когда я проверял brython, это не была полная реализация python. Также неясно, как следует измерять «лучшее» или «как выбирать между ними». Самый быстрый? Python в основном не используется для скорости. Реализует большинство функций / библиотек? Могут быть модули, которые вы никогда бы не использовали в браузере. Является ли дополнительный (не совместимый с cpython) синтаксисом для общих операций (манипулирование деревом) плюсом или минусом? Я не думаю, что производительность в тесте так важна.
синоним
Тест производительности является важным фактором, когда он не примерно на 20-40% быстрее, а скорее примерно на 1000% улучшений в некоторых операциях. Brython - это более легкий слой над javascript, поэтому он отличается. Кроме того, в наши дни проект полностью совместим с Python3 - он просто включает в проект несколько хорошо известных и зрелых библиотек Javascript по мере необходимости, например, для обработки больших целых чисел.
jsbueno
7

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

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

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

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

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

ТОДО: Я постараюсь дополнить свой ответ надежными тестами.

Олемис Ланг
источник
8
Как сторонник скуппа, я могу сказать вам, что он поддерживает выражения генератора. :)
albertjan
6

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

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

user1114907
источник
Не могли бы вы подвести итоги?
Джей
1
18 июня Пьер Квентель сказал: «Хорошо, есть проблема с производительностью, но ситуация улучшается; версия, над которой я сейчас работаю (3.2.7), запускает тест pystone 2.5 быстрее, чем 3.2.6. Это все еще 15 раз медленнее, чем CPython, но в первые дни он был в тысячи раз медленнее ».
user1114907
1
Я запустил тест pystones с помощью транспилятора rapydscript-ng, и он показал в 5 раз большую скорость CPython на моем компьютере с Windows 10, 600000 pystones / sec против 125000 pystones / sec. Коэффициент примерно в 5 раз скорость CPython для rapydscript-ng увеличивается примерно до 7 раз в CPython, если я отключу перегрузку оператора, которая используется в GlowScript VPython, в котором, например, a + b преобразуется в ["+"] (b) ; это сделано для того, чтобы можно было легко манипулировать трехмерными векторами.
user1114907
Я не сказал, что комментарий Quentel относится к Brython.
user1114907
2
Я больше не проводил тестов. Я сначала перешел на RapydScript-NG, когда разработка RapydScript застопорилась. Позже, когда Алекс Цепков вернулся к разработке, у меня состоялся обмен мнениями с ним, в ходе которого даже он согласился, что проект NG Ковида Гояла больше подходит для моего конкретного использования на сайте glowscript.org. Цепков хочет создать смешанный язык Python / JavaScript для веб-программистов, в то время как Гоял делает упор на приближении к стандартному Python и обеспечивает хорошую поддержку компиляции в браузере, и то и другое является ключевым моментом в моей работе.
user1114907
4

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

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

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

Икарито
источник
Skulpt по-прежнему активно поддерживается и используется довольно большой базой пользователей (несколько очень популярных курсов по cousera), он может не получать столько выпусков, сколько транскрипция, но есть гораздо больше сопровождающих, сопровождающих, которые создали продукт на нем. Так что они в нем надолго. :)
albertjan 03
3

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

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

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

Дайан Ган
источник