Poursuivre l'exécution d'un notebook malgré les erreurs

Résolu
Utilisateur anonyme - 25 juil. 2024 à 09:26
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 - 25 juil. 2024 à 15:23

Bonjour à tous, 

Je souhaite lancer successivement des notebooks Jupyter depuis un notebook maître. Pratiquement, mon notebook maître contient n cellules de code, avec une ligne pour chaque cellule :

% run notebook_n.ipynb

Puis je lance l'exécution via "run all".

Globalement, cela fonctionne très bien, sauf quand une erreur ou exception est levée. Dans ce cas, tout s'arrête. 

J'aimerais que dans ce cas, la cellule de code suivante (donc le notebook suivant) se lance. En effet, les notebooks sont indépendants et une éventuelle erreur sur l'un n'impacte pas les suivants. Mon but est simplement d'étaler l'exécution pour que cela se fasse tranquillement en mon absence...

Savez-vous si je peux faire cela simplement ?

Merci d'avance

PS : je lance mes notebook via vscode, et ils sont codés en Python 10. 


Windows / Chrome 126.0.0.0

A voir également:

4 réponses

mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
Modifié le 25 juil. 2024 à 15:29

Bonjour,

Le plus simple est d'utiliser runipy, qui permet d'installer la commande du même nom. Celle-ci permet d'exécuter un notebook en ligne de commande, et donc potentiellement au travers d'un sous-processus.

from os import environ
from subprocess import call

environ['myvar'] = 'value'
call(["runipy", "MyNotebook.ipynb"])

Ainsi, on pourrait parfaitement envisager de boucler sur tous les fichiers ipynb qui t'intéressent et d'envelopper runipy dans un try catch.

import sys
from subprocess import call
from pathlib import Path

NOTEBOOK_DIR = Path.home() / "notebooks"
for ipynb in NOTEBOOK_DIR.glob("*.ipynb"):
    printf(f"Running {ipynb}")
    try:
        call(["runipy", ipynb])
    catch Exception as e:
        print(e, sys.stderr)

Libre à toi ensuite d'améliorer cette boucle pour lancer plusieurs notebooks en parallèle (voir par exemple le module multiprocessing).

Ceci dit, je ne pense pas qu'avoir un notebook maître qui lance des notebook esclaves soit une bonne architecture de travail. Si ta problématique est de faire une suite de test qui s'assure que chaque notebook reste fonctionnel, peut-être devrais-tu regarder ceci. J'en profite pour rappeler que selon moi, dans un projet bien organisé tu devrais avoir :

  • l'essentiel du code dans un module python conçu par tes soins (par exemple réalisé à l'aide de poetry)
  • une suite de tests qui valide le bon fonctionnement dudit module python (par exemple réalisée à l'aide de pytest)
  • éventuellement, quelques notebooks avec un minimum de code
    • pour illustrer l'utilisation du modules (et que l'on peut par la suite inclure dans la documentation générée par sphinx)
      • Cela a du sens de les inclure dans ta suite de tests
    • pour réaliser des expérimentations (dans un contexte scientifique)
      • Dans ce cas le notebook devrait essentiellement comporter des appels aux fonctions de ton module et éventuellement du code matplotlib si tu as des courbes à tracer.
      • Comme ce sont des notebooks parfois long à exécutés, tu n'as pas forcément envie de les inclure dans ta suite de test

Bonne chance

1
Utilisateur anonyme
25 juil. 2024 à 11:18

Merci pour ta réponse. 

J'ai en effet pensé à cela, mais j'avais cru comprendre que cela ne permettait pas de poursuivre l'exécution d'un notebook (comme celle d'un script).

Et comme chaque notebook est assez long, je demandais avant de lancer. 

As-tu expérimenté le try/except dans le cadre que j'évoque (succession de notebooks dans un notebook maître lancé par "run all"?

Merci en tous cas 

0
Utilisateur anonyme
25 juil. 2024 à 14:15

Bonjour 

Non, je n’utilise pas jupyter.

Cependant, c’est le principe de la gestion d’erreur, intercepter l’exception, la gérer si possible et dans ce cas continuer l’exécution 


0