Среда: Pyodide в браузере и её ограничения
Code challenges в курсе работают на Pyodide — порте CPython в WebAssembly, исполняемом прямо в браузерном Web Worker’е. Это даёт нам почти полный Python без установки на машину пользователя, но снимает то, что зависит от ресурсов операционной системы.
Этот урок — карта окружения: что работает, что не работает, и как мы обходим ограничения через mock-данные и io.StringIO.
Что работает
Pyodide включает большую часть stdlib. Вот safe-subset, который мы используем в challenges (с ним вы точно не упрётесь в ModuleNotFoundError):
Этот список — не исчерпывающий, а минимальный набор, который точно стабилен в Pyodide и используется в курсе. Полная taxonomy stdlib — в Python docs, но если модуля нет в этом списке, перед использованием в challenge стоит проверить.
Что НЕ работает (или работает иначе)
WASM sandbox — это не полный Linux: нет процессов, нет TCP/UDP сокетов, нет real OS threads. Список модулей, которые валидатор validate-allowed-imports блокирует автоматически (попытка import вызовет FAIL):
subprocess,os.system,os.fork— нет OS processes в WASM, форкать нечегоsocket,urllib.request,requests,aiohttp— нет TCP/UDP в browser sandboxmultiprocessing,threading(с shared mutable state) — нет real OS threadstkinter— нет displaysqlite3— отсутствует в стандартной Pyodide build (опционально через separate package)ctypes— частично (нетdlopenдля системных библиотек)signal— semantics отличается от CPython, ненадёжно- Bare
open('/etc/passwd')— virtual FS работает, но мы используемio.StringIOдля портативности challenges (см. ниже)
Если challenge требует одного из «не работает» — это будет отмечено в условии задачи прямо: тема преподаётся conceptual только, без runnable кода. Например, asyncio объясняется через диаграммы и pseudo-code, но не запускается в браузере.
Что мы делаем вместо
Когда учебник говорит «прочитай файл» или «сделай HTTP-запрос», в браузере мы используем mock через io.StringIO или заранее заданный JSON-литерал. Это не дидактический компромисс: те же конструкции применимы к real-world коду — csv.reader принимает любой iterator строк, не только file-объект.
| Хочется | В Pyodide делаем |
|---|---|
| HTTP request | Mock через io.StringIO с заранее заданным JSON-литералом |
| Чтение CSV-файла | io.StringIO("col1,col2\n1,2\n3,4") подаётся в csv.reader |
| Параллелизм | Conceptual урок про concurrent.futures API, без real spawning |
| Long-running task | timeoutMs ≤ 15 000 ms; компактные тестовые входы (N ≤ 10⁴) |
| Запись на диск | io.StringIO для сборки результата + getvalue() для проверки |
Когда нужно покинуть браузер
Pyodide прекрасен для большинства DSA-уроков, но есть темы, где WASM ограничивает или искажает поведение. В таких уроках появится callout «Run on Your Machine» с указанием установить локальный CPython 3.13 параллельно.
Run-on-Your-Machine callouts появятся в M11 (Logging / Monitoring), M12 (Performance Profiling), M13 (Packaging). Для memory profiling через tracemalloc с большими буферами, real subprocess через subprocess.run, real network — устанавливайте локальный Python 3.13 и работайте параллельно. Все примеры воспроизводимы в обоих окружениях.
Ключевые выводы
- Pyodide = CPython в WASM = почти весь stdlib минус OS-зависимое
- Forbidden imports список зафиксирован валидатором
validate-allowed-imports.cjs— попыткаimport socketв challenge вызовет FAIL до отправки на сервер - Run-on-Your-Machine callouts — для тех мест, где WASM ограничивает: вы устанавливаете локальный CPython 3.13 и проходите параллельно