Вот некоторая информация о 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:
Есть как минимум три способа решить эту проблему:
- Используйте флаг -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:
- Используйте venv (это похоже на новую встроенную версию virtualenv, которая использует меньше места для каждого проекта), чтобы настроить папку проекта python3.5 (просто введите: python3.5 -m venv foldername - обходной путь для ubuntu с проблемами пакета для 3.5 ). Это делает, среди прочего, «имя папки» с подпапкой bin.
- Установите пакет Transcrypt python с помощью pip ('имя папки / bin / pip install transcrypt'), который устанавливает его в имя папки / lib / python3.5 / site-packages / transcrypt.
activate
текущий терминал, если вы не хотите каждый раз вводить полный путь к имени папки / bin / python3.5. Активируйте, набрав: 'исходная папка / bin / активировать'
- Начните писать код и компилировать его в 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)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) Кроме того, вы не можете перебирать dicts по умолчанию, используя 'for i in dict:', без включения этого (cmd line -i или __pragma__('iconv')
, но вы можете избежать необходимости включать его, просто используя член keys (), например:
for key, value in dict.items():
Чтобы подвести итог
Мне нравится Brython, потому что с ним легко начать работу и протестировать ваш код (просто F5). Это ближе к истинному питону, потому что там большая часть стандартной библиотеки. Мне не нравится включать движок транспиляции (Edit: или можно рассматривать его как виртуальную машину python) в браузере и большой размер выводимого javascript. Если бы мне пришлось что-то делать (но все еще используя Brython), я бы использовал методы javascript для управления DOM из brython (что вы можете сделать ..) вместо того, чтобы так сильно полагаться на методы brython, потому что это трата времени на перемещение на другой транспайлер, когда мои потребности изменились.
Мне нравится Transcrypt, потому что выводимый javascript действительно «скудный и средний», и потому что единственное, что вы загружаете на стороне браузера, - это созданный вами код javascript, который по размеру похож на ваш код на Python. Также потому, что он поддерживает исходные карты и потому что он дает мне возможность контролировать выводимый javascript. И с его помощью я немного научился оптимизации.
Надеюсь, это поможет кому-то увидеть, какие из них могут быть полезны для их конкретного проекта.