7e. Exécution & Pilotage
L'outil d'exécution Python (python_code_executor.py) soumet du code au
Python Worker — un micro-service Docker isolé. L'isolation est garantie par
un processus OS distinct (multiprocessing.Process) pour chaque
requête, avec son propre répertoire temporaire. Une fois le processus terminé ou expiré, il
n'existe plus aucune trace en mémoire.
Python Worker (Sandbox)
| Attribut | Valeur vérifiée |
|---|---|
| Conteneur | echo-python-worker |
| Port interne | 5000 (Flask, app.run(host='0.0.0.0', port=5000)) |
| Source | 21-docker-python-worker/worker_api.py |
| Version | 1.4 (HEALTHCHECK) |
| Framework | Flask (mode threaded=True) — pas FastAPI |
| Image de base | python:3.14-slim |
| Bibliothèques disponibles |
pandas, numpy, scipy, scikit-learn,
yfinance, beautifulsoup4, openpyxl,
regex, sympy, mgzip, orjson,
pybase64, networkx + bibliothèque standard Python 3.14
|
| Bibliothèques absentes | matplotlib et requests ne sont pas dans requirements.txt |
| Timeout | 30 s par défaut (paramètre timeout de la requête, configurable par l'appelant) |
| Isolation | Processus OS distinct (multiprocessing.Process) + répertoire temporaire dédié (tempfile.TemporaryDirectory) |
| Sortie | stdout et stderr capturés séparément (contextlib.redirect_stdout/stderr) |
Outil python_code_executor.py
L'outil soumet un bloc de code Python au Worker via POST /execute.
La réponse contient :
output: contenu de stdout (chaîne de texte).error: contenu de stderr (vide si succès).status:success,error(stderr non vide) oucritical_error(exception non rattrapée / crash silencieux).
?? Absence de matplotlib — alternative
matplotlib n'est pas installé dans le Worker. Pour produire des graphiques,
ECHO utilise l'outil Visual Intelligence (universal_visual_generator.py)
qui génère des interfaces interactives ECharts, Vega ou Mermaid côté navigateur — sans
bibliothèque de rendu serveur.
?? Isolation par processus OS — mécanisme exact
Contrairement à un simple exec() dans un thread Python, le Worker crée un
multiprocessing.Process pour chaque exécution. Cela garantit une vraie isolation
mémoire (adress space séparé) et empêche les effets de bord entre requêtes concurrentes.
Flask en mode threaded=True permet de servir plusieurs requêtes HTTP en parallèle,
chacune lançant son propre sous-processus.
?? Sécurité de l'exécution
Le Worker n'est pas une sandbox hermétique contre du code malveillant intentionnel : le sous-processus a accès au réseau Docker interne. Il est conçu pour exécuter du code de confiance généré par le modèle, pas du code provenant de sources tierces non vérifiées.