Python как технология разработки приложений преимущественно используется для создания сценариев автоматизации, создания бэкэнда и веб-приложений, а также для анализа данных и использования методов статистики и машинного обучения. Также есть некоторые подходы к созданию мобильных приложений на Python (например, движок Kivy над OpenGL для Android). Но остается незаполненной ниша использования Python-приложений в веб-браузере, что могло бы позволить перенести часть обработки данных непосредственно на клиентское устройство и создавать полноценные fullstack-приложения на одной технологии. Решением этой задачи может стать кросскомпиляция Python в код WebAssembly, который может выполняться как в браузере, так и на сервере с использованием nodejs или движка V8, либо SSVM (Second State Virtual Machine). В статье мы рассмотрим несколько подходов к запуску Python-приложений внутри браузера и сервера с использованием WebAssembly.

Наиболее важным аспектом реализации является возможность взаимодействия со средой выполнения через интерфейс WASI (WebAssembly System Interface), которая (в зависимости от окружения) предоставляет доступ к файловой системе, оборудованию, хранению данных, аппаратным решениям для нейронных сетей, графической библиотеке и др. Поскольку для Python-приложений нужно обеспечить не только вычислительные возможности, но и доступ к ресурсам среды, аспект реализации WASI является одним из наиболее важных и именно с ним сейчас есть сложности в разных реализациях.

Одним из вариантов компиляции Python приложения для выполнения в браузере является использование emscripten для CPython, но на текущий момент он не поддерживает работу с PyPI пакетами и сетевые запросы. Аналогично запуск через emscripten в NodeJS не поддерживает пакеты, но может работать с многопоточностью и сигналами. Для сборки Python через emscripten в WebAssembly можно использовать эти сценарии.

Второй вариант - использование специализированных реализаций wasm runtime (например, wasmtime) и компиляция с использованием их реализаций WASI, например для Python: https://enarx.dev/docs/webassembly/python

Наиболее продвинутыми вариантами являются Pyodide (поддерживает пакеты, работу с сетью, сигналы, а также полноценный доступ к файловой системе, доступ ко всеми API браузера) и Pygame (поддерживает кросскомпиляцию в WebAssembly и работу с графикой и мультимедиа). Для установки пакетов в Pyodide используется micropip. Pyodide может использоваться для запуска Python внутри Javascript кода, для этого нужно подключить https://cdn.jsdelivr.net/pyodide/v0.21.3/full/pyodide.js и запустить фрагмент кода:

async function main() {
  let pyodide = await loadPyodide();
  // Pyodide is now ready to use...
  console.log(pyodide.runPython(`
    import sys
    sys.version
  `));
};
main();

Также можно использовать внешние модули:

await pyodide.loadPackage("numpy");
pyodide.runPython(`
  import numpy
  x=numpy.ones((3, 4))
`);
pyodide.globals.get('x').toJs();

Для манипуляций объектами DOM и доступа к WebAPI можно подключить модуль js и через него получать доступ к document, window и другим объектам браузера. Также pyodide предоставляет порты пакетов для работы с сетью (from pyodide.http import pyfetch), работу с файловой системой в NodeJS (FS). Кроме этого Pyodide представляет интерфейс для взаимодействия с wasm-кодом. 

Наиболее интересным выглядит проект CoWasm, который предоставляет набор инструментов для сборки и порты многих часто используемых python-библиотек (включая numpy, pandas, sqlite, posix, openssl, zlib, libgit2) и среду исполнения Python-кода в WASM python-wasm. Для использования python-кода можно использовать как REPL (npx python-wasm), так и подключать его в код через require:

{syncPython, asyncPython} = require('python-wasm')
python = await syncPython();
python.exec('import numpy')
python.repr('numpy.linspace(0, 10, num=5)')

Для реализации wasm-портов пакетов используются возможности для компиляции языка Zig + TypeScript, либо компиляция через Zig Wasm исходных кодов библиотек на C. После компиляции будет созданы два варианта модулей - нативный (для запуска в обычной среде исполнения python) и wasm (для использования совместно с браузером / NodeJS). Для выполнения кода в дистрибутиве нужно запустить следующие команды:

. bin/env.sh
cd packages/python-wasm
./bin/python-wasm

Несмотря на то, что запускаться будет Python в REPL, это полноценная среда исполнения WebAssembly (и это можно проверить через запрос версии системы import sys; sys.version). 

Пакет python-wasm также может использоваться для выполнения кода в браузере:

const python = require("python-wasm");
python.exec('import os')
python.repr('os.version')

Пример использования CoWasm в браузере можно посмотреть здесь.

Для тестирования cowasm также можно собрать Docker-контейнер. 

Проект активно развивается, среди основных контрибьюторов @bobuk . Основная идея проекта обозначена как возможность переиспользования Python-кода между клиентом и сервером и организации совместной работы над кодом с использованием возможностей WebRTC и других технологий мгновенного обмена данными. 

Всем, прочитавшим статью, рекомендую ближайшие открытые онлайн-уроки:

Сегодня вечером поговорим о том, какое место SOLID занимает в современной разработке и как применятся в Python. Регистрация — по ссылке.

Завтра вечером научимся работать со встроенными модулями. Узнаем про модули (os, pathlib, functools). Регистрация — по ссылке.

Комментарии (7)


  1. alec_kalinin
    23.11.2022 18:56
    -1

    Рекомендую проект https://pyscript.net/. Можно посмотреть примеры, Python в броузере в PyScript реализации уже выглядит вполне реальным инструментом. А с учетом того, что PyScript детище anaconda.io, разработчика наиболее популярного научного дистрибутива Python, кажется что этот проект может взлететь.

    В общем, Python скоро всех съест...


    1. pharo
      23.11.2022 21:03

      В общем, Python скоро всех съест...

      Perl/Raku/Go?

      Интересно, что и в еженедельном челендже решения задач в ориентации на Perl/Raku пользователей
      Проект на Github — perlweeklychallenge-club
      Сайт
      решения публикуются от пользователей площадки и на Python языке. :)

      P.S. Rosetta Code/Rank languages by popularity/Full list
      Python пока на 7-ом месте рейтинга этой площадки в решении представленных задач.


    1. grSereger
      23.11.2022 21:41
      +4

      Обязательно кто-то кого-то должен съесть?


    1. md40v
      23.11.2022 22:28
      +3

      История знает не мало громких заявлений о наиновейших технологиях,которые вытеснят другие популярные.

      Но они увы,ушли в небытие,хотя взлёт был очень шикарен.

      А старые добрые технологии модмфицировались и продолжают жить.

      Взять хотя бы Adobe(Macromedia) Flash.


    1. MaryRabinovich
      24.11.2022 04:16

      Скажите, пожалуйста, а это уже варианты "писать фронтенд на питоне", или оно, например, пока что тяжёлое? Я прошла по ссылке в статье на https://cowasm.sh/ и дальше на https://cowasm.org/ , оба довольно медленные.


  1. mrkaban
    24.11.2022 05:28
    +1

    С Pyodide и Brython проблема в том, что по ним мало документации и примеров, а их мало, потому что невысокая популярность. Замкнутый круг.

    Тема весьма интересная и удачи им в развитии.


    1. AdnreiZubr
      24.11.2022 21:54

      Пробовал с ними разобраться, но ... там еще не всё можно сделать, поэтому, увы, js проще.