|
| 1 | +# [Client Side Python](https://github.com/europanite/client_side_python "Client Side Python") |
| 2 | + |
| 3 | +[](https://opensource.org/licenses/Apache-2.0) |
| 4 | + |
| 5 | +[](https://github.com/europanite/client_side_python/actions/workflows/ci.yml) |
| 6 | +[](https://github.com/europanite/client_side_python/actions/workflows/docker.yml) |
| 7 | +[](https://github.com/europanite/client_side_python/actions/workflows/deploy-pages.yml) |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | +<p align="right"> |
| 15 | + <a href="./README.md">🇺🇸 English</a> | |
| 16 | + <a href="./README.ja.md">🇯🇵 日本語</a> | |
| 17 | + <a href="./README.zh-CN.md">🇨🇳 简体中文</a> | |
| 18 | + <a href="./README.es.md">🇪🇸 Español</a> | |
| 19 | + <a href="./README.pt-BR.md">🇧🇷 Português (Brasil)</a> | |
| 20 | + <a href="./README.ko.md">🇰🇷 한국어</a> | |
| 21 | + <a href="./README.de.md">🇩🇪 Deutsch</a> | |
| 22 | + <a href="./README.fr.md">🇫🇷 Français</a> |
| 23 | +</p> |
| 24 | + |
| 25 | + |
| 26 | +> **Note** |
| 27 | +> This is a translated version of this README. The English version (`README.md`) is the source of truth. |
| 28 | +
|
| 29 | + |
| 30 | + |
| 31 | + [PlayGround](https://europanite.github.io/client_side_python/) |
| 32 | + |
| 33 | +Ein browserbasiertes Python-Playground, das vollständig clientseitig läuft. |
| 34 | + |
| 35 | +--- |
| 36 | + |
| 37 | +## Überblick |
| 38 | + |
| 39 | +Client Side Python ist ein **browserbasiertes Python-Playground auf Basis von Pyodide**. |
| 40 | +Der gesamte Python-Code wird **vollständig innerhalb deines Browser-Tabs ausgeführt** (WebAssembly, kein Backend), sodass dein Code deine Maschine nie verlässt. |
| 41 | + |
| 42 | +Dadurch eignet es sich gut für: |
| 43 | + |
| 44 | +- Das schnelle Ausprobieren kleiner Python-Snippets |
| 45 | +- Das Vorführen von Python-Grundlagen im Unterricht oder in Workshops |
| 46 | +- Das Experimentieren mit einfachen numerischen oder Skript-Aufgaben in einer sicheren Sandbox |
| 47 | +- Das Zeigen, wie WebAssembly + Pyodide „echtes“ Python in den Browser bringen können |
| 48 | + |
| 49 | +--- |
| 50 | + |
| 51 | +## Funktionen |
| 52 | + |
| 53 | +- **Vollständig clientseitige Ausführung** |
| 54 | + - Verwendet [Pyodide](https://pyodide.org), um CPython in WebAssembly auszuführen. |
| 55 | + - Standardmäßig sind weder Server, Datenbank noch Authentifizierung erforderlich. |
| 56 | + |
| 57 | +- **Einfacher Code-Editor + Konsole** |
| 58 | + - Textbereich für Python-Code. |
| 59 | + - Konsolenbereich, der `stdout` und `stderr` anzeigt. |
| 60 | + - Schaltflächen: **Run**, **Stop**, **Clear**, **Load Sample**, **Copy Output**. |
| 61 | + |
| 62 | +- **Sanfter „Stop“-Mechanismus** |
| 63 | + - Die Ausführung ist mit einem Soft-Cancel-Token umhüllt. |
| 64 | + - Wenn du **Stop** drückst, wird der aktuelle Lauf logisch abgebrochen, sodass verspätete Ergebnisse ignoriert werden, anstatt die UI zu beschädigen. |
| 65 | + |
| 66 | +- **Responsives Web-UI** |
| 67 | + - Erstellt mit **Expo / React Native Web** und **Material UI**-Komponenten. |
| 68 | + - Das Layout passt sich an unterschiedliche Viewport-Größen an (Desktop / Tablet). |
| 69 | + |
| 70 | +- **Deterministische CI über Docker** |
| 71 | + - Jest-Tests laufen in einem Docker-Container mit `docker-compose.test.yml`. |
| 72 | + - GitHub-Actions-Workflows für CI und Docker-basierte Tests sind enthalten. |
| 73 | + |
| 74 | +- **Automatische Bereitstellung auf GitHub Pages** |
| 75 | + - Ein GitHub-Actions-Workflow baut das Expo-Web-Bundle und veröffentlicht es für den Branch `main` auf GitHub Pages. |
| 76 | + |
| 77 | +--- |
| 78 | + |
| 79 | +## Funktionsweise |
| 80 | + |
| 81 | +Beim ersten Laden der App passiert Folgendes: |
| 82 | + |
| 83 | +1. Pyodide wird von einem CDN geladen. |
| 84 | +2. Die Pyodide-Laufzeit wird initialisiert und `runPythonAsync` wird verfügbar gemacht. |
| 85 | +3. Benutzerdefinierte Handler für `stdout` und `stderr` werden angebunden, damit Python-Ausgaben in die Konsole auf der Seite gestreamt werden. |
| 86 | +4. Ein einfaches Ausführungs-Token wird verwendet, um einen **soft Stop** zu implementieren: |
| 87 | + - Jeder Lauf erhöht eine interne `execId`. |
| 88 | + - Wenn ein Lauf mit einer veralteten `execId` endet, wird seine Ausgabe verworfen. |
| 89 | + - Dadurch wird verhindert, dass veraltete Ergebnisse älterer Läufe die Konsole verschmutzen. |
| 90 | + |
| 91 | +All das geschieht **im Browser**, ganz ohne Backend-API-Aufrufe. |
| 92 | + |
| 93 | +--- |
| 94 | + |
| 95 | +## 🚀 Erste Schritte |
| 96 | + |
| 97 | +### 1. Voraussetzungen |
| 98 | +- [Docker](https://www.docker.com/) und [Docker Compose](https://docs.docker.com/compose/) |
| 99 | + |
| 100 | +### 2. Alle Services bauen und starten: |
| 101 | + |
| 102 | +```bash |
| 103 | +# set environment variables: |
| 104 | +export REACT_NATIVE_PACKAGER_HOSTNAME=${YOUR_HOST} |
| 105 | + |
| 106 | +# Build the image |
| 107 | +docker compose build |
| 108 | + |
| 109 | +# Run the container |
| 110 | +docker compose up |
| 111 | +``` |
| 112 | + |
| 113 | +### 3. Testen: |
| 114 | +```bash |
| 115 | +docker compose -f docker-compose.test.yml up --build --exit-code-from frontend_test |
| 116 | +``` |
| 117 | + |
| 118 | +--- |
| 119 | + |
| 120 | +# License |
| 121 | +- Apache License 2.0 |
0 commit comments