
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 и других технологий мгновенного обмена данными.

Хотите выйти за рамки привычных задач на Python и расширить свои возможности в разработке? Продолжить обучение и углубить знания можно на программах OTUS:
Специализация «Python‑разработчик» — освойте Python и современные инструменты разработки, научитесь создавать полноценные приложения и работать с бэкендом.
Курс «Python‑разработчик. Продвинутый уровень» — углубите знания языка, разберитесь со сложными техническими задачами и научитесь писать производительный и поддерживаемый код.
Выбирайте программу под свой уровень и переходите от теории к практике на реальных задачах.

