Технічний огляд

Як Pyroom запускає Python у браузері — середовище виконання, архітектура, підтримувані API та доступні пакети.

Середовище виконання Python

Версія Python
3.11.3
CPython — повна специфікація мови
Рушій виконання
Pyodide 0.24.1
CPython, скомпільований у WebAssembly

Pyroom використовує Pyodide — порт CPython до WebAssembly — для запуску Python повністю в браузері. Жоден сервер не виконує ваш код. Усе працює локально у вкладці браузера через окремий робочий потік (Web Worker).

Стандартна бібліотека Python доступна повністю: math, random, datetime, json, re, collections, itertools, functools, io, sys, os.path, dataclasses, typing, enum, pathlib та інші.

  • Потоки (threading, multiprocessing) не підтримуються — WebAssembly є однопотоковим
  • Реальний доступ до файлової системи недоступний — os.listdir, відкриття/запис файлів ізольовані
  • Сирі мережеві сокети (socket) недоступні в браузері

Архітектура

Pyroom використовує двопотокову модель, щоб інтерфейс залишався швидким під час виконання Python. Середовище виконання Python запускається у окремому робочому потоці (Web Worker), який спілкується з основним потоком інтерфейсу через повідомлення та SharedArrayBuffer для синхронних викликів (необхідно для відображення Tkinter і Turtle).

Вкладка браузера
Редактор Monaco  |  Панель перегляду  |  Консоль
↕ postMessage / SharedArrayBuffer
Робочий потік
Pyodide (Python 3.11 / WASM)  |  рівень Tkinter  |  рівень плагінів
↓ скомпільовано з CPython
Середовище
WebAssembly (.wasm)  +  стандартна бібліотека Python (.zip)

На iOS та iPadOS SharedArrayBuffer недоступний, тому Pyroom переходить до запуску Python в основному потоці. Tkinter і Turtle продовжують працювати, але інтерфейс може реагувати повільніше під час виконання.

Заголовки Cross-Origin Isolation (COOP + COEP) необхідні для доступу до SharedArrayBuffer. Pyroom налаштовує їх на серверному розгортанні.

Власна реалізація Tkinter

Примітка: Pyroom не використовує реальний модуль tkinter. Замість цього постачається власний Python-shim, який відображає виклики Tkinter API на операції з DOM браузера.

Стандартний tkinter побудований поверх Tcl/Tk — десктопного GUI-тулкіту, який не може працювати в браузері. Pyroom реалізує шар сумісності з Tkinter, що складається з двох частин:

  • Рівень Python — модуль tkinter, написаний на Python, який перехоплює створення віджетів та виклики методів, передаючи їх через міст JavaScript
  • Рендерер інтерфейсу — модуль TypeScript в основному потоці, який перетворює операції з віджетами на реальні елементи DOM, що відображаються в панелі перегляду

Підтримуваний Tkinter API:

  • Tk(), mainloop(), title(), geometry()
  • Button, Label, Entry, Frame, Text, Canvas
  • Listbox, Scrollbar, Scale, Checkbutton, Radiobutton
  • Menu, menu.add_command(), menu.add_cascade(), menu.add_separator()
  • messagebox.showinfo(), showwarning(), showerror(), askyesno(), askokcancel()
  • filedialog.askopenfilename(), filedialog.asksaveasfilename() (на основі prompt браузера)
  • .pack(), .grid(row, column, columnspan, rowspan), .place(x, y, width, height)
  • .config() / .configure(), .cget(), .bind(), .focus_set()
  • StringVar, IntVar, BooleanVar, .get() / .set()
  • after(ms, callback), after_cancel()

Відомі обмеження порівняно з десктопним Tkinter:

  • Розширене оформлення віджетів, власні шрифти та растрові зображення мають обмежену підтримку
  • messagebox використовує діалогові вікна браузера alert та confirm
  • filedialog використовує діалог prompt браузера — без реального вибору файлів
  • Полотно (Canvas): дуги, зображення та растрові елементи не реалізовані
  • Додаткові вікна (Toplevel) не підтримуються

Черепаша графіка (Turtle)

Аналогічно до Tkinter, Pyroom замінює стандартний модуль turtle власною реалізацією, яка відображає команди малювання на полотно SVG у панелі перегляду.

  • Усі стандартні команди руху: forward(), backward(), left(), right(), goto(), setx(), sety()
  • Керування пером: penup(), pendown(), pencolor(), pensize(), speed()
  • Заливка: begin_fill(), end_fill(), fillcolor()
  • Допоміжні: circle(), dot(), write(), clear(), reset()
  • Екран: bgcolor(), title(), screensize()

Доступні пакети

Pyodide постачається з великим набором наукових, аналітичних та допоміжних пакетів, які можна імпортувати напряму. Пакети завантажуються на вимогу при першому імпорті, або їх можна попередньо завантажити через Налаштування бібліотек у середовищі Pyroom.

Повний список: pyodide.org → Пакети в Pyodide

Наукові та математичні

numpyscipysympympmathstatsmodelsautograduncertaintiesiminuitnlopt

Дані та таблиці

pandaspyarrowxarrayfastparquetxlrdpython-calamine

Візуалізація

matplotlibbokehaltairPillowimageiowordcloudsvgwrite

Машинне навчання

scikit-learnlightgbmxgboostriver

Мережа та HTTP

requestshttpxaiohttppyodide-http

Парсинг та текст

beautifulsoup4lxmlnltkregexpyparsing

Графи та мережі

networkxigraphrustworkx

Серіалізація

pyyamlmsgpackorjsonujsonprotobufcryptography

Встановлення пакетів не зі списку

Пакети, яких немає в Pyodide, можна встановити під час виконання за допомогою micropip (чисті Python-пакети з PyPI):

import micropip
await micropip.install("назва-пакету")

Редактор

Pyroom використовує Monaco Editor — той самий редактор, що лежить в основі VS Code. Він забезпечує:

  • Підсвічування синтаксису Python
  • Автодоповнення та IntelliSense для вбудованих функцій Python
  • Скасування / повторення дій (undo / redo)
  • Налаштовуваний розмір шрифту та тема (темна / світла / авто)