Exercices Projets guidés Outil : executer du code Python
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Outil : executer du code Python

La vraie puissance de Claude Code, c'est de pouvoir executer du code. Le LLM ecrit un script, le lance, voit les erreurs, corrige, relance. C'est la boucle magique qui fait que l'assistant ne se contente pas de deviner : il verifie.

Mais executer du code arbitraire sur une machine, c'est un terrain mine. Un script mal ecrit peut faire une boucle infinie, supprimer des fichiers, ou saturer la memoire. C'est pour ca que meme le vrai Claude Code execute le code dans un sandbox avec des limites.

En Python, subprocess permet de lancer un script dans un processus separe avec un timeout :

import subprocess

resultat = subprocess.run(
["python3", "-c", "print('hello')"],
capture_output=True,
text=True,
timeout=10
)
print(resultat.stdout) # "hello
"
print(resultat.stderr) # ""
print(resultat.returncode) # 0 = succes

Pour ce projet, on ne va pas lancer de vrais processus dans le sandbox. A la place, ecris une fonction executer_code_simule(code, timeout=10) qui simule l'execution en utilisant exec() avec des gardes-fous.

La fonction doit :

Verifier que le code ne contient pas de commandes dangereuses (import os, import shutil, subprocess, eval(, open( en mode ecriture). Si c'est le cas, refuser l'execution.
Executer le code avec exec() en capturant stdout via un StringIO.
Gerer le cas ou le code leve une exception.
Retourner un dictionnaire structure avec le resultat.

Commandes interdites a detecter : "import os", "import shutil", "import subprocess", "eval(", "__import__", "exec(".

Format de retour en cas de succes :

{"succes": True, "stdout": "hello
", "stderr": "", "code_retour": 0}

Format de retour en cas d'erreur d'execution :

{"succes": False, "stdout": "", "stderr": "NameError: name 'x' is not defined", "code_retour": 1}

Format de retour si code dangereux :

{"succes": False, "stdout": "", "stderr": "Code refuse : commande interdite detectee", "code_retour": -1}

Exemple :

executer_code_simule("print('Bonjour')")
renvoie {"succes": True, "stdout": "Bonjour\n", "stderr": "", "code_retour": 0}

executer_code_simule("x = 1/0")
renvoie {"succes": False, "stdout": "", "stderr": "ZeroDivisionError: division by zero", "code_retour": 1}

executer_code_simule("import os; os.system('rm -rf /')")
renvoie {"succes": False, "stdout": "", "stderr": "Code refuse : commande interdite detectee", "code_retour": -1}

Tests (4/5)

Code simple avec print
r = executer_code_simule("print('Bonjour')")
assert r["succes"] == True, "Un simple print doit reussir"
assert "Bonjour" in r["stdout"], f"stdout doit contenir 'Bonjour', obtenu: '{r['stdout']}'"
assert r["code_retour"] == 0
Code avec erreur
r = executer_code_simule("x = 1 / 0")
assert r["succes"] == False, "Une division par zero doit echouer"
assert "ZeroDivisionError" in r["stderr"], f"stderr doit contenir ZeroDivisionError, obtenu: '{r['stderr']}'"
assert r["code_retour"] == 1
Code dangereux refuse
r = executer_code_simule("import os")
assert r["succes"] == False, "import os doit etre refuse"
assert r["code_retour"] == -1, "Le code retour doit etre -1 pour du code refuse"
assert "interdit" in r["stderr"].lower() or "refuse" in r["stderr"].lower()
Plusieurs prints
code = "for i in range(3):\n    print(i)"
r = executer_code_simule(code)
assert r["succes"] == True
assert "0" in r["stdout"] and "1" in r["stdout"] and "2" in r["stdout"]

+ 0 tests cachés

Indices (3 disponibles)

solution.py