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 без адаптації. Застереження: я це написав.
Jacques de Hooge

1
Привіт fzzylogic, я додав тег, тому люди тепер можуть задавати запитання щодо SO, використовуючи його. Замінив на нього тег JS, оскільки найменш вірогідний пошук, якщо ви віддаєте перевагу використанню Python у браузері.
Jacques de Hooge

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 . Я настійно рекомендую прочитати його.

Хороший підсумок можна побачити на наступних малюнках.

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

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


61

Ось деяка інформація про Brython vs Transcrypt (липень 2016 р., Оскільки Transcrypt була додана як опція з цього питання ОП), отримана запуском проекту з Brython кілька місяців тому та переходом до Transcrypt (завершено переміщення минулого тижня). Мені подобаються Brython і Transcrypt, і я бачу, як їх використовувати.

Для людей, які не знайомі з цим, Brython і Transcrypt обидва вводять python-переклад у javascript (Редагувати: можливо, краще розглядати Brython як `` реалізацію Python для браузера '', оскільки він не створює автономний javascript). Для обох потрібен синтаксис Python 3. Brython включає значну кількість стандартних бібліотек Python, і деякі з них є власними для роботи з речами, пов'язаними з Інтернетом, тоді як Transcrypt здебільшого уникає цього і пропонує замість цього використовувати бібліотеки Javascript.

Брайтон ( 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, запускаєте транскрипцію проти python, і він випльовує javascript, на який ви можете посилатись у своєму проекті. Це більше схоже на традиційний компілятор ще й тим, що він пропонує певний контроль над вихідними даними. Наприклад, ви можете вибрати компіляцію до ES6 або ES5, або попросити її вивести вихідні карти (щоб під час налагодження давайте браузер переводив вас безпосередньо до відповідного коду python, замість згенерованого коду javascript.) Вивід javascript Transcrypt досить стислий ( або по-іншому, це досить і стисло). У моєму випадку 150 кБ пітона перетворюється на 165 кБ немініфікованого javascript ES5. Для порівняння, версія Brython мого проекту використовувала близько 800 Кб після перетворення.

Однак, щоб отримати переваги лаконічності Transcrypts, потрібно трохи прочитати документи (насправді лише трохи). Наприклад, у 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)всередині вашого коду, щоб сказати компілятору транскрипту локально ввімкнути автоматичне перетворення в значення істини, схожі на пітон.
  • Замість того, щоб перевіряти значення істини, уникніть проблеми взагалі, просто перевіривши len (myList)> 0 ... Можливо, це буде добре для більшості ситуацій, це робить роботу для мого легкого використання.

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

Головне, щоб налаштувати його після встановлення Python3.5:

  1. Використовуйте venv (це як нова вбудована версія virtualenv, яка використовує менше місця для кожного проекту), щоб створити папку проекту python3.5 (просто введіть: python3.5 -m назва папки venv - обхідне рішення для ubuntu з проблемами з пакетом для 3.5 ). Це, серед іншого, робить "ім'я папки" із підпапкою bin.
  2. Встановіть пакет Transcrypt python за допомогою pip ('ім'я папки / bin / pip install transcrypt'), який встановлює його в папкуname / lib / python3.5 / site-пакети / transcrypt.
  3. activateпоточний термінал, якщо ви не хочете щоразу вводити повний шлях до імені папки / bin / python3.5. Активуйте, набравши: 'ім'я вихідної папки / смітник / активувати'
  4. Почніть писати код і складати його в javascript для тестування. Компілюйте з папки, в якій ви пишете свій код. Наприклад, я використовував ім’я папки / www / project. Отже, компакт-диск у цю папку та запустіть: '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 (node)'. 3) замінити всі функції DOM brython на альтернативні варіанти javascript. напр. ім'я класу = Ім'я класу; text = textContent; html = innerHTML; parent = parentNode; діти = дочірні вузли тощо. Я думаю, якщо вам потрібно щось, що містить альтернативи, необхідні деяким старим браузерам, тоді для цього існують бібліотеки javascript. 4) set_timeout Brython замінено на javascripts setTimeout 5) HTML-теги Brython, такі як BR (), потрібно замінити, використовуючи звичайні способи javascript, а також переробляти будь-які місця, які ви використовували, це синтаксис маніпуляції <= dom. Або вставте розмітку простого тексту як innerHTML, або зробіть елементи, використовуючи синтаксис javascript, а потім додайте їх, використовуючи звичайний синтаксис DOM javascript. Я також помітив, що для прапорців brython використовує "if checkbox = 'check':", але Transcrypt задоволений "if checkbox:" .. Або вставте розмітку простого тексту як innerHTML, або зробіть елементи, використовуючи синтаксис javascript, а потім вкладіть їх, використовуючи звичайний синтаксис DOM javascript. Я також помітив, що для прапорців brython використовує "if checkbox = 'check':", але Transcrypt задоволений "if checkbox:" .. Або вставте розмітку простого тексту як innerHTML, або зробіть елементи, використовуючи синтаксис javascript, а потім вкладіть їх, використовуючи звичайний синтаксис DOM javascript. Я також помітив, що для прапорців brython використовує "if checkbox = 'check':", але Transcrypt задоволений "if checkbox:" ..

  • За минулий тиждень я закінчив перенесення проекту лінії 2700, тоді Transcrypt не мав підтримки для декількох незначних речей (хоча їх було досить легко замінити наповнювачами), це були 1) str.lower, str.split (str. split присутній, але, схоже, це розділення javascript, яке працює інакше, ніж версія python, на поведінку якої я покладався), 2) кругла (це, мабуть, підтримується у версії розробника) та 3) isinstance didn не працюю на str, int та float, лише на dict, list та set. 4) Ще однією відмінністю від Brython, яку я помітив, є те, що якщо я втягую JSON-представлення dict, мені потрібно це зробити, використовуючи 'myDict = dict (дані)', тоді як brython був задоволений 'myDict = data'. Але це може бути пов’язано з чимось у json.loads Brython, який я замінив безпосередньо на 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) Крім того, ви не можете повторювати диктовки за замовчуванням, використовуючи 'for i in dict:', не вмикаючи цього (cmd line -i or __pragma__('iconv'), але ви можете уникнути необхідності вмикати його, просто використовуючи елемент keys (), наприклад:

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

Підсумовувати

  • Мені подобається Brython, тому що з ним легко почати і тестувати свій код (просто F5). Це ближче до справжнього python, оскільки там знаходиться більшість стандартних бібліотек. Мені не подобається включати механізм транпіляції (Редагувати: Або можна розглядати його як python VM) у браузері та великий розмір виведеного javascript. Якби мені довелося щось робити (але все-таки використовуючи Brython), я б використав методи javascript для маніпулювання DOM з brython (що ви можете зробити ..), замість того, щоб стільки спиратися на методи brython, оскільки це марно витрачений час на пересування до іншого перетворювача, коли мої потреби змінилися.

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

Сподіваюся, це допоможе комусь зрозуміти, що з цього може підійти для конкретного проекту.


1
Ви впевнені, що Brython є перекладачем? Я майже впевнений, що він реалізує інтерпретатор Python в JavaScript. Якщо це був транслятор, вам не потрібно було б поєднувати його з вашим додатком.
Карл Сміт,

@Carl Smith Цікавий момент, я не думав про це так. Brython перетворює код python у javascript, але оскільки javascript не має стандартного байт-коду, можливо, можна було б розглянути згенерований javascript як 'байт-код' для механізму Brython.
fzzylogic

1
Ви мене неправильно зрозуміли. Я не думаю, що Brython взагалі перетворює Python на JavaScript. Він просто реалізує інтерпретатор Python в JS, а не в C. Відповідно до їх GitHub README "Brython (браузер Python) - це реалізація Python 3, що працює в браузері, з інтерфейсом до елементів DOM і подій".
Carl Smith

4
@jsbueno На даний момент доступні насіння, рандінт, вибір та випадкові випадки, які призначені лише як відправна точка. Насправді ми сподіваємось, що хтось забере його та заповнить, так само, як це було зроблено для re, що було високо в нашому списку. Не повинно бути так важко. Кількість бібліотек зросла, але внески дуже вітаються. Хоча акцент буде залишатися на використанні бібліотек JS, я особисто вітаю більше стандартних бібліотек.
Jacques de Hooge

1
Гарний огляд. Загалом, я бачу головною відмінністю (яку ви заявляєте, але не наголошуєте), що мета Brython - насправді дозволити вам використовувати Python у браузері, тоді як, схоже, мета Transcrypt - дозволити вам використовувати синтаксис Python для написання JavaScript. Це означає, що Transcrypt готовий робити такі речі, як різниця правдивості, яка на базовому рівні відхиляється від семантики Python, а також, схоже, спрямована на код, який використовує бібліотеки JavaScript; тоді як Brython намагається тиражувати Python якомога ближче з ідеєю, що ви будете робити все в Python.
BrenBarn

12

Я використовував та зобов’язувався скульптувати, а також pypyjs. І вони всі три дуже різні, що будь-яке порівняння є спірним, якщо ви запитаєте мене.

Це залежить від того, що ви шукаєте, що матиме найбільший сенс.

PyPyJS

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

Він побудований за допомогою emscripten і швидше, ніж CPython, під час запуску тесту pystone.

Я коротко розповів про pypyjs, ось слайди.

Скульптура

Це навчальний інструмент (або він з часом перетворився на це), він компілює ваш python в машину стану, дуже точно імітуючи компілятор cpython. По суті це рукописна реалізація компілятора python у javascript. Це дозволяє виконувати асинхронне виконання, що дозволяє:

while (True):
    print "hi"

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

Skulpt - це єдиний, який підтримує асинхронні продовження, він дозволяє призупинити виконання python під час вирішення якоїсь асинхронної ситуації. Робимо цю роботу:

from time import sleep
sleep(1)

Скульпт працює приблизно на десяту частину швидкості CPython, якщо порівнювати пістон.

Брітон

Я найменше знаю про це, можливо @ olemis-lang може розширити це. Але поряд з очевидною різницею, що Brython - це py3, а інші py2. Brython також є перетворювачем.

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


Розробники PyPyJS зупинили розробку. Також підтримка Python3, як видається, ще не завершена. github.com/pypyjs/pypyjs/issues/213 та github.com/pypyjs/pypyjs/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, добре перевірена, ...), але я не впевнений, чи підходить він для запуску в браузері. Це може змінитися в міру розвитку проекту.

TODO: Я спробую доповнити свою відповідь надійними тестами.


8
Як комітер для skulpt, я можу сказати вам, що він підтримує вирази генератора. :)
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=uk#!topic/brython/20hAC9L3ayE


Не могли б ви підсумувати результати?
Джей,

1
18 червня П'єр Квентель сказав: "Гаразд, проблема з продуктивністю, але все покращується; версія, над якою я зараз працюю (3.2.7), запускає тест pystone 2.5 швидше, ніж 3.2.6. Це все ще 15 в рази повільніше, ніж CPython, але на початку це було в тисячі разів повільніше ".
user1114907

1
Я провів тестовий тест pystones, використовуючи транслятор rapydscript-ng, і він порівняв показник у 5 разів швидше, ніж CPython на моєму комп'ютері з Windows 10, 600000 пістонів / сек проти 125000 пістонів / сек. Коефіцієнт приблизно в 5 разів швидкості CPython для rapydscript-ng збільшується приблизно до 7 разів CPython, якщо я вимкну операторне перевантаження, що використовується в GlowScript VPython, в якому, наприклад, a + b перетворюється на ["+"] (b) ; це робиться, щоб забезпечити легке маніпулювання 3D-векторами.
user1114907

Я не зміг сказати, що коментар Квентеля посилався на Брайтона.
user1114907

2
Я більше не виконував жодних еталонів. Спочатку я перейшов на RapydScript-NG, коли розвиток RapydScript зупинився. Потім пізніше, коли Алекс Цепков повернувся до розробки, я мав з ним обмін, в якому навіть він погодився, що проект NG Ковіда Гояла більше підходить для мого конкретного використання на glowscript.org. Цепков хоче створити змішану мову Python / JavaScript для веб-програмістів, тоді як Goyal наголошує на наближенні стандартного Python і забезпечує хорошу підтримку компіляції в браузері, що є ключовим фактором моєї роботи.
user1114907

4

Оскільки ніхто про це не згадував, я вважав, що варто згадати Batavia, яка реалізує віртуальну машину Python для запуску попередньо скомпільованого байт-коду Python.

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

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


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.