Как запустить тяжелый Python в браузере без сервера
Представьте, что вам нужно построить график в Matplotlib или обработать массив данных в Pandas, но вы не хотите арендовать сервер, настраивать бэкенд и гонять байты туда-сюда. Хочется, чтобы всё работало прямо в браузере у пользователя, используя его процессор и память. Звучит как фантастика, учитывая, что Python — это интерпретируемый язык с кучей зависимостей на C. Однако проект Pyodide делает это реальностью с помощью WebAssembly.
Что это вообще такое
Если вкратце, Pyodide — это полноценный дистрибутив CPython, скомпилированный в WebAssembly (Wasm). Это не какая-то урезанная версия или эмулятор. Это настоящий интерпретатор, который живет внутри вкладки браузера или в среде Node.js.
Проект вырос из недр Mozilla в 2018 году. Изначально его создавали для интерактивных научных блокнотов Iodide, чтобы ученые могли делиться результатами вычислений без необходимости разворачивать сложную инфраструктуру. Сейчас это самостоятельный проект с огромным сообществом.
Почему это работает
Главная проблема Python в вебе всегда заключалась в библиотеках. Написать интерпретатор на JS — задача решаемая, но как быть с NumPy или SciPy? Они написаны на C и Fortran. Разработчики Pyodide решили это, портировав не только сам Python, но и целую пачку тяжеловесных библиотек.
Сейчас через их внутренний менеджер пакетов micropip можно поставить любой "чистый" Python-пакет (pure Python wheel) из PyPI. А для монстров вроде Pandas, Scikit-learn или Matplotlib подготовлены специальные сборки, которые учитывают специфику Wasm.
Как подружить два мира
Одна из самых крутых штук в проекте — это мост между JavaScript и Python. Вы можете вызывать функции Python из JS и наоборот, при этом типы данных конвертируются автоматически.
Например, вот так выглядит типичный запуск:
// Загружаем рантайм
let pyodide = await loadPyodide();
// Импортируем пакет и считаем что-нибудь
await pyodide.loadPackage("numpy");
pyodide.runPython(`
import numpy as np
array = np.ones((3, 3))
print(array.sum())
`);
Интересно, что Python внутри браузера получает полный доступ к Web API. Вы можете манипулировать DOM, делать Fetch-запросы или работать с Canvas, используя привычный синтаксис Python. Поддерживаются даже async/await и обработка исключений между языками.
Техническая начинка
Проект состоит из нескольких слоев:
- Пропатченный CPython.
- Интерфейс взаимодействия (Foreign Function Interface), который связывает объекты JS и Python.
- Инфраструктура Emscripten для компиляции.
- Инструменты для кросс-компиляции сторонних библиотек.
Это не самая легкая штука. При первой загрузке пользователю придется скачать несколько мегабайт рантайма. Но для специфических задач — например, образовательных платформ, онлайн-редакторов кода или инструментов визуализации данных — это оправданная цена.
Кому и зачем это нужно
В моей практике Pyodide идеально подходит для трех сценариев:
- Интерактивная документация. Если вы пишете библиотеку на Python, вы можете дать пользователю потыкать примеры прямо в браузере, не заставляя его ничего устанавливать.
- Клиентская аналитика. Если нужно делать сложную математику на стороне клиента, чтобы не нагружать свои серверы или соблюсти приватность данных.
- Образование. Создание курсов по программированию, где код выполняется мгновенно и безопасно в песочнице браузера.
Стоит ли пробовать
Если вы планируете заменить весь фронтенд на Python — скорее всего, вы разочаруетесь в производительности и размере бандла. Но если вам нужно точечно использовать мощь Python-экосистемы там, где JavaScript пасует (сложная линейная алгебра, статистика, парсинг специфических форматов), Pyodide — это лучшее решение на сегодня.
Начать проще всего с их онлайн-консоли. Там можно сразу проверить, заведется ли нужная вам библиотека и насколько быстро она будет работать в вашем браузере. Скудный README проекта компенсируется отличной документацией на официальном сайте, так что порог входа вполне терпимый.
