Chargement de Python... Veuillez patienter.
terminal = false
packages = ["numpy", "matplotlib"]
[[fetch]]
files = []
import sys
import io
import traceback
from js import document, console, window
from pyodide.ffi import create_proxy
import base64
# Configuration matplotlib pour PyScript
import matplotlib
matplotlib.use('Agg') # Backend non-interactif pour PyScript
import matplotlib.pyplot as plt
# Contexte global partagé entre toutes les cellules
global_context = {'plt': plt, 'matplotlib': matplotlib}
def capture_output(func, *args, **kwargs):
"""Capture la sortie d'une fonction"""
old_stdout = sys.stdout
old_stderr = sys.stderr
stdout_capture = io.StringIO()
stderr_capture = io.StringIO()
sys.stdout = stdout_capture
sys.stderr = stderr_capture
try:
result = func(*args, **kwargs)
stdout_output = stdout_capture.getvalue()
stderr_output = stderr_capture.getvalue()
return result, stdout_output, stderr_output
finally:
sys.stdout = old_stdout
sys.stderr = old_stderr
def handle_matplotlib_figures(output_element):
"""Gère l'affichage des figures matplotlib"""
current_figures = plt.get_fignums()
if current_figures:
for fig_num in current_figures:
fig = plt.figure(fig_num)
# Convertir la figure en image base64
buf = io.BytesIO()
fig.savefig(buf, format='png', bbox_inches='tight', dpi=150)
buf.seek(0)
img_data = base64.b64encode(buf.read()).decode()
buf.close()
# Créer un élément img pour afficher la figure
img_element = document.createElement('img')
img_element.src = f'data:image/png;base64,{img_data}'
img_element.className = 'matplotlib-figure'
img_element.style.maxWidth = '800px'
img_element.style.maxHeight = '100%'
img_element.style.height = 'auto'
img_element.style.display = 'block'
img_element.style.margin = '10px auto'
output_element.appendChild(img_element)
# Fermer toutes les figures pour éviter les accumulations
plt.close('all')
return True
return False
def execute_python_code(code, cell_id):
"""Exécute le code Python et affiche le résultat"""
output_element = document.querySelector(f'#output-{cell_id}')
loading_element = document.querySelector(f'#loading-{cell_id}')
# Afficher le loading
loading_element.style.display = 'block'
output_element.innerHTML = '' # Utiliser innerHTML pour permettre les éléments HTML
output_element.className = 'output'
try:
def run_code():
# Exécuter le code dans le contexte global
exec(code, global_context)
# Si la dernière ligne est une expression (pas un statement), l'évaluer et retourner le résultat
lines = code.strip().split('\n')
if lines:
last_line = lines[-1].strip()
# Vérifier que ce n'est pas un statement Python commun
if (last_line and
not last_line.startswith((' ', '\t')) and
not last_line.endswith(':') and
not last_line.startswith(('print(', 'import ', 'from ', 'def ', 'class ', 'if ', 'for ', 'while ', 'try:', 'except', 'with ', 'assert ', 'del ', 'pass', 'break', 'continue', 'return', 'yield', 'raise', 'global ', 'nonlocal ', 'plt.', 'fig')) and
'=' not in last_line.split('#')[0]): # Éviter les assignments
try:
return eval(last_line, global_context)
except:
pass
return None
result, stdout_output, stderr_output = capture_output(run_code)
# Gérer l'affichage des figures matplotlib
has_figures = handle_matplotlib_figures(output_element)
# Construire la sortie texte
output = ""
if stdout_output:
output += stdout_output
if stderr_output:
output += stderr_output
if result is not None:
output += str(result)
if output:
# S'il y a déjà des figures, ajouter le texte à la suite
if has_figures:
text_div = document.createElement('div')
text_div.className = 'text-output'
text_div.textContent = output
output_element.appendChild(text_div)
else:
output_element.textContent = output
elif not has_figures:
output_element.textContent = "✓ Code exécuté avec succès"
output_element.className = 'output success'
except Exception as e:
error_output = f"❌ Erreur:\n{str(e)}\n\n{traceback.format_exc()}"
output_element.textContent = error_output
output_element.className = 'output error'
finally:
loading_element.style.display = 'none'
# Exposer les fonctions à JavaScript
window.execute_python_code = create_proxy(execute_python_code)
# Signaler que PyScript est prêt
console.log("PyScript ready!")
try:
# Activer l'interface immédiatement
status_element = document.querySelector('#pyscript-status')
if status_element:
status_element.innerHTML = 'Python est prêt ! Vous pouvez maintenant exécuter votre code.'
status_element.className = 'pyscript-status pyscript-ready'
# Activer tous les boutons d'exécution
run_buttons = document.querySelectorAll('.btn-run')
for button in run_buttons:
button.disabled = False
# Notifier JavaScript
window.pyScriptIsReady = True
except Exception as e:
console.log(f"Error during PyScript initialization: {e}")