← На главную
Guides· 6/6/2026· 3 мин чтения

Запускаем чужой Python-код без страха: micropython-wasm как настоящая песочница

Как запустить изолированный Python-код через micropython-wasm 0.1a2 — без доступа к файлам, сети и с лимитом памяти. Пошаговый гайд с CLI и примерами.

Запускаем чужой Python-код без страха: micropython-wasm как настоящая песочница
AI-assisted, edited by a human reviewer

Simon Willison выпустил версию 0.1a2 своей библиотеки micropython-wasm и добавил к ней CLI. Если вы когда-нибудь думали «хочу дать пользователям запускать Python, но не хочу получить rm -rf / на проде» — это именно тот инструмент.

Зачем вообще нужна WASM-песочница для Python

Стандартный exec() в Python не изолирует ничего. Код видит файловую систему, сеть, переменные окружения. Даже subprocess с ограничениями — это костыль, а не архитектура.

micropython-wasm запускает MicroPython внутри WebAssembly-рантайма Wasmtime. Каждое выполнение — отдельный экземпляр виртуальной машины, без доступа к хосту по умолчанию. Это не «почти изолировано», а реально изолировано на уровне WASI (WebAssembly System Interface).

Что внутри инструмента

Библиотека построена на трёх компонентах:

  • Кастомный MicroPython WASI-артефакт — не Emscripten-сборка для браузера, а специальная WASI-версия под серверный рантайм.
  • Официальный пакет `wasmtime` — Python-биндинги к Wasmtime, движку от Bytecode Alliance.
  • Свежий экземпляр Wasmtime на каждый запуск — никакого состояния между вызовами.

По умолчанию гость не получает:

  • доступа к файловой системе хоста (можно явно открыть read-only директорию, если нужно);
  • сетевых возможностей;
  • неограниченной памяти и времени — всё конфигурируется через параметры WebAssembly memory, fuel и wall-clock.

Установка и первый запуск через CLI

Устанавливается одной командой:

``bash pip install micropython-wasm ``

После установки 0.1a2 доступен CLI. Проверяем:

``bash micropython-wasm --help ``

Запустить строку кода прямо из терминала:

``bash micropython-wasm -c "print('hello from sandbox')" ``

Запустить файл:

``bash micropython-wasm script.py ``

CLI появился в этом релизе специально как способ быстро попробовать инструмент — Willison добавил его, когда писал раздел «Try it yourself» для своего блог-поста и понял, что без терминального интерфейса объяснять неудобно.

Использование из Python-кода

CLI — это удобно для экспериментов, но основной сценарий — вызов из своего приложения:

```python from micropython_wasm import MicroPython

mp = MicroPython() result = mp.run("print(2 ** 10)") print(result.stdout) # 1024 ```

Если нужно передать данные внутрь и получить результат обратно:

```python from micropython_wasm import MicroPython

mp = MicroPython() code = """ data = [1, 2, 3, 4, 5] print(sum(data)) """ result = mp.run(code) print(result.stdout) # 15 ```

Каждый вызов MicroPython() — новый изолированный экземпляр. Состояние не сохраняется между вызовами, что одновременно и ограничение, и фича для безопасности.

Настройка лимитов

Одно из главных преимуществ WASI-подхода — контролируемые ресурсы. Wasmtime поддерживает «топливо» (fuel) — единицу вычислительных инструкций, после которой выполнение прерывается:

```python from micropython_wasm import MicroPython

mp = MicroPython(fuel=1_000_000) # лимит инструкций result = mp.run("x = 0\nwhile True:\n x += 1")

выполнение остановится по исчерпанию топлива, не зависнет навсегда

print(result.stderr) ```

Если нужно дать доступ к конкретной директории только на чтение:

``python mp = MicroPython(read_dirs=["/tmp/data"]) result = mp.run("f = open('/tmp/data/input.txt'); print(f.read())") ``

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

Где ломается

MicroPython — не CPython. Реализован синтаксис Python 3.4 плюс async/await из 3.5. Из стандартной библиотеки доступен урезанный набор. Если код использует pathlib, dataclasses, typing или что-то из stdlib версии 3.6+, скорее всего получите ошибку импорта.

Производительность на старте. Каждый вызов поднимает новый Wasmtime-экземпляр. Для коротких скриптов это десятки миллисекунд накладных расходов — приемлемо для API, неприемлемо для tight loop с тысячами вызовов в секунду.

Отладка ошибок внутри sandbox. Трейсбеки из MicroPython отличаются от CPython — привычные инструменты вроде traceback.format_exc() не работают так же. Придётся парсить result.stderr вручную.

Версия 0.1a2 — это альфа. API может измениться. Не стоит строить на этом продакшн-критичную логику прямо сейчас — лучше зафиксировать версию и следить за релизами.

Что попробовать дальше

Если micropython-wasm подходит по задаче, следующий шаг — посмотреть на параметры wall_clock для ограничения времени выполнения и протестировать, какие модули из вашего типичного кода реально доступны в MicroPython. Репозиторий проекта: github.com/simonw/micropython-wasm. Там же в issues можно отследить, когда выйдет стабильная версия и появится поддержка более широкого subset стандартной библиотеки.

Источники

By: PLai AI