Как запустить тяжелый Python в браузере без сервера

19 мар 2026
14,804
1,043
138
2 недели

Представьте, что вам нужно построить график в 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 и обработка исключений между языками.

Техническая начинка

Проект состоит из нескольких слоев:

  1. Пропатченный CPython.
  2. Интерфейс взаимодействия (Foreign Function Interface), который связывает объекты JS и Python.
  3. Инфраструктура Emscripten для компиляции.
  4. Инструменты для кросс-компиляции сторонних библиотек.

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

Кому и зачем это нужно

В моей практике Pyodide идеально подходит для трех сценариев:

  1. Интерактивная документация. Если вы пишете библиотеку на Python, вы можете дать пользователю потыкать примеры прямо в браузере, не заставляя его ничего устанавливать.
  2. Клиентская аналитика. Если нужно делать сложную математику на стороне клиента, чтобы не нагружать свои серверы или соблюсти приватность данных.
  3. Образование. Создание курсов по программированию, где код выполняется мгновенно и безопасно в песочнице браузера.

Стоит ли пробовать

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

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

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.