company_banner

Вышел новый релиз «Python для браузеров», встречаем Brython 3.9


    Код Brython Python (на скриншоте — версия 3.8.8)

    Разработчики проекта Brython Python выпустили новый релиз, Brython 3.9. Сам проект позиционируется, как «Python для браузера». Он основан на Python 3 и выполняется на стороне браузера, причем для разработки веб-скриптов вместо JavaScript используется Python.

    Код проекта написан на Python и распространяется под лицензией BSD. Новый релиз совместим с Python 3.9, плюс обновлена стандартная библиотека.

    Для того, чтобы определять логику работы сайта на стороне клиента, используя Python вместо JS, веб-разработчику необходимо подключить две библиотеки, brython.js и brython_stdlib.js. Для подключения Python-кода на странице, используется тег script с mime-типом text/python.

    Со стороны Brython разрешено как встраивать код на страницу, так и загружать внешние скрипты. Пример:

    <script type="text/python" src="test.py">

    Из скрипта предоставляется полный доступ к элементам и событиям DOM. Кроме доступа к стандартной библиотеке Python есть и специализированные библиотеки для работы с DOM и JavaScript-библиотеками, такими как jQuery, D3, Highcharts и Raphael.

    Поддерживается использование CSS-фреймворков JavaScript-библиотеками, такими как jQuery, D3, Highcharts и Raphael.

    Python-блоки выполняются из блоков script через предварительную компиляцию кода, которая выполняется обработчиком Brython после загрузки страницы. Компиляция запускается при помощи вызова функции brython(), например через добавление body onload="brython()".

    На основе кода Python формируется представление на языке JS, затем оно выполняется штатным JavaScript-движком браузера.

    Что касается производительности, то большинство операций во встраиваемых в web-страницы Python-сценариях близка к производительности Cpython. Единственный момент, когда возникает задержка — это этап компиляции. Но задержку можно устранить при помощи предварительно скомпилированного в JavaScript кода, которая используется для ускорения загрузки стандартной библиотеки.

    <script type="text/python">
     
    import time
    import math
     
    from browser import document
    import browser.timer
     
    content = document["content"]
     
    ...
     
    canvas = content.select_one(".clock")
     
    if hasattr(canvas, 'getContext'):
        ctx = canvas.getContext("2d")
     
        browser.timer.set_interval(set_clock, 100)
        show_hours()
    else:
        content.select_one('.navig_zone').html = "canvas is not supported"
     
    </script>

    Подробнее о запуске Brython


    Для того, чтобы «Python для браузера» мог как транслировать, так и исполнять Python-код подобно JS-коду, требуется вызывать Brython в момент загрузки тела документа.

    <body onload="brython()">

    В этом случае тег ищет теги script с типом text/python и запускает код. Для того, чтобы использовать API для работы с вебом, разработчики Brython реализовали простое решение — импорт API, аналогичный импорту любого иного модуля на Python:

    from browser import document, html, window

    Brython справляется со всем сам, так что дополнительные команды выполнять не нужно.

    Важный момент — для работы с Brython необходим опыт работы с JavaScript, хотя бы базовый уровень. Без этого разобраться будет довольно сложно.

    Selectel
    ИТ-инфраструктура для бизнеса

    Похожие публикации

    Комментарии 71

      0
      А почему на КДПВ версия 3.8.8?
        +11
        Прикольно конечно, питончик ведь старый друг и товарищ, клёвый, модный, все дела — сам люблю и когда статью увидел, такой: «Ух ты! Даёшь нормальный питончк на Webasm под LLVM прям в браузере!»… ан нет — ещё одна транспайл из питончика в js поделка.
        Не, js я тоже люблю, прям очень, так что пока наверное попридержу коней с этим бритоном. Штука на любителя, но фаново, спору нет, да )
          +5
          Теперь можно быть разработчиком fullstack, зная только один язык :)
          P.S. правда, уже давно: первым таким языком стал JS
            +1

            А как же Java? GWT вполне нишу занимал.

              0

              Ещё Kotlin со своим Kotlin/JS

                0

                Точно, а ещё Dart вспомнился, он тоже под веб может, транслируясь в JS.

                  +1
                  Kotlin (даже не Kotlin/JS) появился на 7 лет позже Node.js и на 11 лет позже GWT
                  0
                  Согласен. В Google не ищут лёгких путей. Сначала подумал, что речь о JWt, который, в отличие от других претендентов, требует наличия чего-то кроме браузера с поддержкой JS на клиентской стороне
                    +3

                    Вомзожно я как-то не так понял ответ, но не совсем ясно что такое JWt, который требует наличия чего-то кроме браузера с поддержкой JS на клиентской стороне и как он связан с Google?


                    Если речь про JWT в смысле JSON Web Tokens, то это вроде как открытый стандарт формата представления некоторой структуры данных.
                    Если речь про GWT, то он не требует на клиентской стороне ничего кроме браузера с поддержкой JS.

                      0
                      Java Web Toolkit, требующий наличия Java Runtime, по аналогии с которым Google сделали свой GWT, только без необходимости в дополнительном ПО с клиентской стороны
                  +3
                  Одновременно с JS (т.е. в ASP — за 13 (!) лет до node.js) первым таким языком стал VBScript ;-)
                    0
                    И какими браузерами он поддерживался?
                      +1
                      Тем, который к концу тысячелетия был у 90% пользователей.
                        +4
                        Это та часть нашей истории, которую мы все пытаемся забыть
                  +8
                  Даёшь нормальный питончк на Webasm
                  Использую в проектах Pyodide.
                    +1
                    О!
                    … Ооо!
                    Вот походу про это надо было статью писать )
                    Спасибо, это уже куда интересней )
                      0

                      Расскажете как-нибудь? Хотя бы даже в комментарии, интересен опыт!

                        +8
                        Мой проект — редактор правил (Rule Editor).
                        Язык правил: Питон.
                        Тестировать правила решили на клиентской стороне через Python WebAssembly на базе FireFox инициативы Pyodide.
                        Т.е. Питон интрерпретатор загружается в клиентский браузер как WebAssembly, компилится под платформу браузера и работает достаточно шустро на ресурсах клиента из браузера.
                        Причины:
                        — скорость тестов (обработка кода на машине клиента),
                        — простота эксплуатации (не требуется доп. действий или установок)
                        — безопасность (пользователь может навредить только сам себе),
                        — перенос нагрузки на клиента (неудачный код не перегрузит сервер)

                        Из недостатков:
                        1. ограниченный набор пакетов (нам для правил достаточно)
                        2. большой wasm файл для начальный загрузки: 12MBytes (в дальнейшем кешируется)

                        Картинки:
                        1. Процесс подгрузки wasm
                        2. Скорость работы интерпретатора в браузере
                          +9

                          Не хотите ли написать статью? Думаю, всем будет интересно почитать подробнее, как с этим работать, какие ограничения.

                            0
                            Никогда не писал в Хабр, но буду рад поделиться, если интересно.
                            Каким вопросам уделить особое внимание?
                              +1

                              В общих чертах — как, что, зачем.
                              Конкретнее — как это запустить на примере каком-нибудь и какие преимущества оно даёт.

                                0
                                Было бы интересно. Подписался.
                        0
                        +3

                        Сравнение скорости с Cpython упомянули, а сравнение скорости с нативным js? Есть ли какие-нибудь бенчмарки для скриптов в браузере независимо от языка?

                          +3
                          есть ли какой нибудь универсальный бенчмарк, подходящий для тракторов и спорткаров?
                            +3
                            Спидометр и датчик расхода топлива.
                              +2
                              Тогда трактора не нужны.
                                +1

                                И часто при выборе трактора смотрят на спидометр? Не уверен даже, что там это обязательный компонент

                                  0
                                  Судя по этой фотке -- необязательный

                                  Но это редкость; почти всегда он есть.
                                    +1
                                    У плугов есть свои рекомендации по скоростям движения, к тому же один и тот же плуг на разной скорости по разному обрабатывает пласт. У боронования еще более другие режимы.
                              +5

                              Ага, прежде чем будет выполняться наш скрипт, нужно сначала скачать целиком рантайм питона вместе с парсером, виртуальной машиной и стандартной библиотекой на общую сумму более мегабайта.

                                +6
                                Да ладно вам, подумаешь сайт грузится 20 секунд на гигабитном канале с R9 3950X.
                                Зато разработчик сидит у моря и попивает свой смузи.
                                  –1

                                  Предлагаю улучшенный вариант:


                                  1. Берем сборку Mono под WASM
                                  2. Запускаем в ней IronPython
                                  3. Запускаем в нем какой-нибудь интерпретатор JS

                                  И вау, у нас появляется возможность выполнять Javascript прямо в браузере! Хотя погодите...

                                  +1
                                  Мегабайт — это много? Главная страница habr.com нынче весит 8 МБ, есличо.
                                    +3

                                    Во-первых, примерно ~6.7 мегабайт из этих 8 занимают картинки.
                                    Во-вторых, главная страница Хабра — не пример для подражания.
                                    В-третьих, да, мегабайт рантайма — это много.

                                  –5
                                  Сначала чисто браузерный JS полез в бакэнд, где давно правит балом его «Матушка» Java (И другие языки)… Теперь «Бакэндовский» питон полез во фронт…
                                  Куда катится мир?
                                    0

                                    Ну так вроде у питона целый букет: PyPy.js, Transcript, Skulpt ну и уже помянутые Brython и Pyodide. А да еще Batavia.

                                      –2
                                      И этого я не понимаю — зачем изобретать 100500 способов выстрелить себе в ногу?
                                        –2
                                        Чтобы пласт питон программистов смог во фуллстек
                                          0
                                          Минусующие, объясните с чем не согласны? Есть целый пласт программистов знающих Питон — ресерч, датасайс, бекенд, им зайти во фронт гораздо проще на знакомом языке, для этого же появился Node.js — чтобы яваскриптовики зашли в бекенд, что в этом негативного?
                                            0
                                            для этого же появился Node.js — чтобы яваскриптовики зашли в бекенд

                                            Ничего подобного: «Dahl criticized the limited possibilities of the most popular web server in 2009, Apache HTTP Server, to handle a lot of concurrent connections (up to 10,000 and more) and the most common way of creating code (sequential programming), when code either blocked the entire process or implied multiple execution stacks in the case of simultaneous connections.»

                                            Т.е. изначально цель была писать для бэкенда асинхронный код; и уже исходя из этой цели был выбран (самый популярный на тот момент) язык, который такое поддерживал.

                                            Всегда язык выбирается в соответствии с задачей; а вы постулируете противоположное — «когда в руках молоток, всё вокруг кажется гвоздями». За этот контрпродуктивный подход и минусуем.
                                              +1
                                              За этот контрпродуктивный подход и минусуем
                                              И в чем здесь контрпродуктивность для питонистов?
                                      +8
                                      С каких пор Java — матушка JavaScript?
                                        +8
                                        Крестная.
                                          –1
                                          Открещивалась-открещивалась и случайно крестила
                                        +1
                                        Сначала чисто браузерный JS полез в бакэнд
                                        Теперь «Бакэндовский» питон полез во фронт
                                        Java первая полезла во фронт
                                          0

                                          Как, по вашему, связаны Java и JS? Вы такую ересь несете, что неприятно аж.

                                            +2

                                            wiki


                                            Первоначально язык назывался Mocha[20][21][22], затем он был переименован в LiveScript[22][23] и предназначался как для программирования на стороне клиента, так и для программирования на стороне сервера (там он должен был называться LiveWire)[19]. На синтаксис оказали влияние языки Си и Java, и, поскольку Java в то время было модным словом[16][19], 4 декабря 1995 года LiveScript переименовали в JavaScript[24], получив соответствующую лицензию у Sun.
                                            +4

                                            Не, сначала произошло разделение на бек и фронт, потом в разных ответвлениях набрали популярность разные языки, а затем закрепилось, как будто так и надо, чтобы разные части писались на разных языках. Но так как язык — это средство объяснения идей программиста машине, то нет объективных причин, почему какой-то язык должен быть только "фронт", а какой-то — "бек". Это скорее один из этапов эволюции — причем не столько языка, сколько сопутствующей инфраструктуры (библиотек, интерпретаторов, компиляторов...)

                                            +6

                                            Столько негодования в комментариях…
                                            Да, понимаю, достойны гореть в аду те, кто тратит батареи юзерских телефонов, их трафик и время на запуски виртуальных машин внутри виртуальных машин.


                                            Но, ведь много есть других применений. Отладочные тулы напилить, админку сделать, свой мониторинг, где не хватает возможностей мейнстримных тулов. И хорошо, что есть возможность покрыть эти задачи, не изучая js и не нанимая фронтендера

                                              0
                                              Brython и ему подобные проекты — очень хорошо подходят для прототипирования. Когда есть какая-то идейка или pet-project и есть понимание, что на питоне получится написать быстрее и не так криво, если писать без опыта на JS.
                                                +3
                                                Важный момент — для работы с Brython необходим опыт работы с JavaScript, хотя бы базовый уровень. Без этого разобраться будет довольно сложно.

                                                Это нужно изучить фреймворк в 2х направлениях в Bpython и в JS

                                                С приходом ES7 и далее не вижу смысла даже делать прототипы на питоне или на чем-то еще.
                                                  0
                                                  С приходом ES7
                                                  так он ещё «не пришёл», а если ориентироваться на ошмётки доли IE в браузерах, то даже ES6 ещё не пришёл окончательно
                                                    +2
                                                    Для таких мучников есть babel с масоным прототипированием под капотом.
                                                  0
                                                  НЯП, Brython не для тех, кто хочет писать фронтендовый код на Python с нуля, а для тех, кто уже написанный (возможно, кем-то другим) на Python код хочет втащить во фронтенд.
                                                0

                                                Намного забавнее пробовать добавлять Python сразу в броузер.

                                                  +2
                                                  Собрать свой хромиум с преферансом и питоном?)
                                                    +1
                                                    Вернуть славные нулевые, когда браузеры* поддерживали скрипты больше чем на одном языке.

                                                    *разные версии IE, в сумме покрывающие >90% пользователей
                                                      0
                                                      А это в принципе возможно? Мне где-то попадался некий cefpython, то я так и не разобрался, работает там код Python напрямую с движком или всё транслируется в JS.
                                                        0

                                                        Судя по названию, это просто библиотека на Питоне с биндингами к браузеру.

                                                      –1
                                                      броузер
                                                      — режет глаза.
                                                      0
                                                      Я подозреваю что Brython в сафари с регулярными опережающие/ретроспективные проверками не работает, если смотреть документацию.
                                                        –1

                                                        Один динамический язык поверх другого динамического языка… А можно не надо?

                                                          –1
                                                          У вас какие-то проблемы с динамическими языками?
                                                            –2

                                                            У меня нет проблем с динамическими языками. Я на них не пишу.


                                                            Вообще был забавный случай, когда знание специфики обоих языков дало возможность хакнуть игру.


                                                            Суть в том, что один сайт, обучающий азам программирования, предлагал научить питону прямо в браузере, через игру на HTML5. В духе "заставьте перса пройти направо", потом "добавьте циклов" и т.д.


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


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


                                                            в JavaScript функция может принимать произвольное число аргументов, и вызывать её можно с любым другим числом аргументов, а все незаполненные будут просто undefined. Python таким не страдает, пока ему явно не скажешь *args, но Python поверх JavaScript о таком не знал… В итоге получилось без ошибок подсунуть якобы-Python функцию от одного аргумента в место, где она вызывалась игрой с двумя аргументами.


                                                            Как прикажете дебажить такие ляпы, если их даже рантайм перестает замечать?

                                                              +1

                                                              Справедливости ради, в Brython это учли. Видимо, ценой плюс одного слоя проверок при вызове функции.


                                                              >>> def f(a):
                                                              ...   print("hi, %s" % a)
                                                              ... 
                                                              >>> f(42)
                                                              hi, 42
                                                              >>> f(42, 37)
                                                              Traceback (most recent call last):
                                                                File <string>, line 1, in <module>
                                                              TypeError: f() takes 1 positional argument but more were given

                                                              https://www.brython.info/tests/console.html?lang=en

                                                                0
                                                                Я согнул детальку в детском конструкторе, и благодаря этому собрал модельку из меньшего числа деталей, чем по инструкции! Я великий хакер!
                                                                  –2

                                                                  Знаете, у слова "хакер" изначально не было значения "security breaker". То, чем я занимался с транслятором той игрушки, очень точно описывается понятием "hacking".


                                                                  Печально, что вы не в состоянии обобщить один пример с игрой на концепцию (не всегда удачной) трансляции одних языков(правил) в другие.

                                                                    0
                                                                    Печально, что вы обобщаете свой опыт с сайтом, обучающим азам программирования на все трансляторы одних языков в другие.
                                                                    Это ну примерно как судить о сопромате по своему опыту с детским конструктором.
                                                                      –1

                                                                      Признаю свое поражение. Я попался в ловушку троллинга и невежества. Или наивности. Хрен вас знает.

                                                                –1

                                                                Да, проблемы, потому что это оксюморон.

                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                            Самое читаемое