← Retour au Blog
Tutorials & How-Tos

Transmettre un notebook Jupyter : sorties enregistrées, état du noyau et nouvelles exécutions

Un notebook enregistré, un noyau en cours de fonctionnement et une nouvelle exécution séquentielle apportent des éléments de preuve différents. Ce guide de transmission des notebooks Jupyter vous aide à choisir la bonne action, à préserver l’original et à expliquer ce que votre collègue peut réellement vérifier.

Rédigé par Hamza Diaz
1 novembre 202610 min de lecture59 vues

Imaginez recevoir un notebook Jupyter contenant un graphique convaincant. La cellule de paramètres située au-dessus a été modifiée depuis la génération du graphique. Cette transmission est hypothétique, mais la question est concrète : que prouve réellement le fichier ?

Le graphique peut être utile. Il ne permet simplement pas d’établir quel code source enregistré l’a produit. Avant de lancer l’exécution de toutes les cellules, déterminez ce que votre collègue doit savoir. Il lui faut peut-être une nouvelle exécution séquentielle. Ou peut-être seulement le notebook original, accompagné d’une explication claire indiquant que ses sorties n’ont pas été régénérées.

Ce guide utilise la méthode de transmission à trois états pour rendre ce choix explicite. Il s’agit d’une liste de contrôle éditoriale, et non d’une fonctionnalité ou d’une certification Jupyter.

Distinguer le fichier notebook, le noyau actif et les preuves de réexécution

Ce que conserve un fichier .ipynb

La spécification du format des notebooks décrit des cellules de code contenant du code source, des sorties et un champ execution_count dont la valeur est un entier ou null. Enregistrer ces champs permet de conserver un document. Cela ne crée pas de piste d’audit reliant chaque résultat visible au code source actuel.

Cette distinction est le point de départ de la méthode de transmission à trois états d’Optijara. Considérez le document enregistré comme un élément de preuve. Examinez séparément le noyau actif, puis indiquez si une nouvelle exécution séquentielle a été tentée. Tant que vous ignorez comment un graphique a été généré, il vous renseigne sur le document enregistré plutôt que sur une réexécution vérifiée.

Ce qui relève du noyau actif

JupyterLab explique comment associer une console de code au noyau d’un notebook. La mémoire du noyau peut donc contenir des éléments issus d’un travail interactif effectué en dehors de la séquence visible du notebook. Ces dépendances méritent votre attention avant qu’une autre personne tente d’exécuter le fichier.

Fermer l’onglet ne les élimine pas. La documentation du panneau des sessions actives de JupyterLab indique que le noyau sous-jacent continue de fonctionner après la fermeture du notebook. Consignez le noyau sélectionné et tout contexte interactif pertinent, au lieu de considérer la fermeture du document comme une réinitialisation.

Ce qu’une nouvelle exécution séquentielle peut établir

Une exécution séquentielle effectuée avec un nouveau noyau, menée à terme et examinée, permet une affirmation limitée : les cellules de code comprises dans le périmètre déclaré ont été exécutées dans l’ordre, dans le contexte consigné, avec le résultat indiqué. Consignez les omissions au lieu de laisser entendre que toutes les cellules ont été exécutées. Les recommandations de PLOS sur le partage des notebooks préconisent de redémarrer le noyau et de réexécuter les cellules pour repérer d’éventuelles étapes manquantes, sans pour autant certifier l’analyse.

Limitez la portée de cette affirmation. Un nouveau noyau peut toujours utiliser le même environnement et les mêmes fichiers. Les services externes restent également en dehors du notebook. Même une exécution réussie laisse ouverte la question de l’analyse : un calcul peut s’exécuter sans produire de réponse correcte ou pertinente.

Examiner un notebook hypothétique exécuté dans le désordre

Un paramètre modifié à côté d’un graphique plus ancien

Dans cet exemple non exécuté, une personne chargée de l’analyse exécute une cellule de paramètres et s’en sert pour préparer les données d’un graphique. Plus tard, elle modifie le code source du paramètre et enregistre le notebook sans réexécuter les cellules qui en dépendent.

Le destinataire voit le nouveau paramètre à côté du graphique plus ancien. Cet exemple ne fournit aucune valeur de sortie observée, aucun compteur d’exécution et aucune erreur constatée. Il illustre une lacune dans les preuves : le graphique seul ne permet pas d’établir si le paramètre enregistré l’a produit.

Les questions à résoudre avant d’accepter le notebook transmis

Commencez par identifier la version du code source enregistré et les entrées que l’expéditeur peut préciser. Demandez si certaines cellules dépendaient de l’état de la console. Surtout, les sorties ont-elles été régénérées après la dernière modification pertinente ?

Les compteurs d’exécution peuvent vous donner une raison d’approfondir l’examen. Ils ne répondent pas à ces questions à eux seuls. Si une réexécution est autorisée et réalisable, documentez la tentative. Sinon, préservez le fichier fourni et indiquez que ses sorties n’ont pas été régénérées.

Une réexécution échouée accompagnée d’un compte rendu clair vaut mieux qu’un notebook soigné dont l’historique d’exécution est inconnu. Le destinataire a besoin de suffisamment d’informations pour décider à quoi se fier, y compris les limites de cette confiance.

Choisir la bonne action JupyterLab avant le partage

Effacer les sorties, redémarrer ou tout exécuter ?

Le registre des commandes JupyterLab répertorie des opérations distinctes. L’effacement utilise notebook:clear-all-cell-outputs ; le redémarrage utilise notebook:restart-kernel. L’exécution de toutes les cellules utilise notebook:run-all-cells, tandis que le redémarrage suivi de l’exécution utilise notebook:restart-run-all.

ActionSortiesNoyau et exécutionVérification avant transmission
Effacer les sortiesSupprime les sorties des cellules du document en mémoire ; enregistrer pour conserver la modificationNe redémarre pas le noyau et n’exécute pas le code sourceExpliquer pourquoi les sorties sont absentes
Redémarrer le noyauNe régénère pas à lui seul les sorties stockéesRedémarre le noyau ; ne réexécute pas le code sourceNe pas présenter les sorties existantes comme récentes
Exécuter toutes les cellulesProduit des sorties à mesure que les cellules s’exécutentExécute les cellules sans demander de nouveau noyauL’état existant du noyau peut avoir une incidence
Redémarrer et exécuter toutes les cellulesRégénère les sorties des cellules atteintes pendant l’exécutionRedémarre, puis exécute les cellules séquentiellementObserver la fin de l’exécution et examiner les échecs
Exécuter et enregistrer séparémentConserve les sorties produites par la tentativeUne nouvelle exécution exige un noyau explicitement neuf et un contexte consignéExaminer le résultat et vérifier l’artefact enregistré

Adapter l’action aux preuves nécessaires

Le même registre des commandes répertorie également l’action combinant redémarrage et effacement, notebook:restart-clear-output. Un redémarrage ne signifie pas automatiquement que les sorties ont été effacées. Le nom d’une commande ne vous indique pas non plus que l’exécution a réussi.

Pour une vérification séquentielle avec un nouveau noyau, choisissez délibérément l’action de redémarrage du noyau suivie de l’exécution de toutes les cellules. Attendez la fin de l’exécution, puis examinez les exceptions et les résultats pertinents avant d’enregistrer. Si l’exécution échoue ou s’arrête prématurément, signalez-le. Les erreurs enregistrées peuvent aider un collègue à diagnostiquer un problème ; elles ne peuvent pas servir de preuve d’une exécution réussie.

Appliquer la méthode de transmission à trois états

Examiner et autoriser la réexécution

Préservez le notebook reçu avant de le modifier. Examinez les cellules à la recherche d’opérations touchant des fichiers ou des bases de données, et vérifiez les requêtes réseau, les entrées sensibles et les appels à des services payants. Les consignes de sécurité de Jupyter Server expliquent clairement la capacité sous-jacente : Jupyter permet l’exécution de code arbitraire. Ouvrir un notebook ne donne pas l’autorisation d’exécuter tout ce qu’il contient.

Choisissez des entrées isolées, hors production, et évitez les secrets actifs. Si des dépendances manquent ou si une écriture externe n’est pas approuvée, laissez la réexécution bloquée et expliquez pourquoi. N’assouplissez pas les limites d’exécution simplement pour obtenir un résultat réussi.

Point de contrôleExigence pratiqueÀ consigner si indisponible
OriginalPréserver l’artefact source reçuIdentité exacte de la source inconnue
AutorisationExaminer les opérations et les entrées approuvéesAbsence de réexécution et motif
EnvironnementIdentifier le noyau, les dépendances et le répertoire de travailContexte manquant explicitement indiqué
EntréesIdentifier les données accessibles et les services pertinentsRestrictions d’accès ou versions inconnues
RésultatExaminer la fin de l’exécution, les erreurs et les sorties pertinentesÉchec, exécution incomplète ou absence de tentative
LivraisonEnregistrer séparément une copie examinéeArtefact manquant ou échec de l’enregistrement

Consigner le contexte et exécuter de manière délibérée

Consignez l’identité du notebook et le noyau sélectionné. Incluez le répertoire de travail et les versions des dépendances, ou une spécification de l’environnement lorsqu’elle est disponible. Identifiez les entrées et les versions pertinentes des modèles ou services. Indiquez comme inconnus les détails qui le sont ; un nom de fichier et un nom de noyau ne représentent qu’une petite partie du contexte.

Pour un notebook utilisant Polars, choisir entre collect et sink_parquet dans Polars aborde une décision connexe concernant les artefacts. Un résultat en mémoire et un jeu de données écrit sont des livrables différents. Précisez lequel est nécessaire pour ce notebook, sans considérer ce guide connexe comme une validation de son exécution.

Les cellules qui écrivent dans une base de données nécessitent un examen distinct des transactions. Le guide DBeaver sur l’enregistrement et la validation des transactions explique cette distinction dans un client de base de données. Posez également cette question lors de l’examen du notebook : enregistrer le notebook ne permet pas d’établir qu’une transaction de base de données a été validée ou annulée en toute sécurité.

Le schéma suivant est une aide à la planification. Il ne consigne pas une exécution observée.

flowchart TD A[Examiner le notebook] --> B{Sans risque et autorisé ?} B -->|Non| C[Consigner l’absence de réexécution] B -->|Oui| D[Consigner le contexte] D --> E[Exécuter avec un nouveau noyau] E --> F[Examiner le résultat] F --> G[Enregistrer un artefact distinct] C --> H[Signaler les limites] G --> H

Examiner, enregistrer séparément et préciser les limites

Enregistrez la copie exécutée et examinée à un emplacement distinct, et conservez l’original. Vérifiez que la copie enregistrée est bien l’artefact que vous souhaitez transmettre. Le simple fait qu’une commande d’exécution rende la main ne suffit pas, et un échec d’enregistrement doit avoir son propre statut, même si l’exécution s’est achevée.

Le plan de mesure ci-dessous consigne des preuves plutôt que des scores. Il vise à déterminer ce qui s’est passé et ce que le destinataire peut examiner, sans inventer de résultats de performance.

QuestionPreuves à recueillirLimite
Qu’a-t-on tenté ?Identité de la source et périmètre de réexécutionNe vérifie ni l’originalité ni l’exactitude
L’exécution s’est-elle achevée ?Fin d’exécution observée et exceptionsNe constitue pas un test de performance
Qu’a-t-on livré ?Identité de l’artefact enregistré et statut de son examenNe prouve pas que chaque widget s’affiche correctement
Que reste-t-il d’inconnu ?Entrées, versions ou vérifications manquantesNe garantit pas une reproductibilité universelle

Un résumé lisible par machine peut assurer la cohérence du compte rendu. Cet exemple est illustratif ; ses valeurs de remplacement ne constituent pas des preuves d’exécution.

{
  "framework": "three-state-handoff",
  "example_only": true,
  "source_artifact": "not-recorded",
  "execution_context": "not-recorded",
  "rerun_status": "not-recorded",
  "saved_artifact": "not-recorded",
  "limitations": ["no-execution-evidence"]
}

Ne remplacez une valeur de remplacement que lorsque vous disposez de preuves observées ou fournies à son sujet. Incluez le périmètre de réexécution à côté du résultat réel. Si aucun artefact exécuté n’a été enregistré, indiquez-le explicitement au lieu de laisser le destinataire supposer qu’un fichier doit exister.

Planifier l’exécution avec nbclient sans exagérer les capacités de l’automatisation

Contexte d’exécution et politique de gestion des erreurs

Cette section décrit une conception d’automatisation fondée sur la documentation. Il ne s’agit pas d’une implémentation exécutable. Aucun notebook n’a été exécuté et aucune dépendance n’a été installée pour ce guide. Aucun appel à une API d’IA n’a été effectué.

Le guide d’exécution de nbclient montre comment configurer NotebookClient avec un noyau sélectionné et un répertoire d’exécution avant d’appeler execute(). Lisez attentivement ses paramètres. La valeur timeout=600 de l’exemple régit l’exécution des cellules, et non la tâche entière. Ni kernel_name='python3' ni le répertoire notebooks/ ne constituent une recommandation universelle.

Le guide de gestion des erreurs de nbclient indique que allow_errors=False est la valeur par défaut. Avec allow_errors=True, l’exécution peut se poursuivre malgré les exceptions des cellules. Décidez quelles erreurs rendent une transmission inacceptable avant de programmer l’automatisation. Atteindre la dernière cellule ne constitue pas, en soi, une réussite.

La décision d’acceptation doit distinguer une exception attendue d’un échec inattendu. Si votre politique autorise une erreur, consignez cette politique et examinez le notebook obtenu à la lumière de celle-ci. Ne modifiez pas discrètement la politique après l’échec d’une exécution. La transmission doit permettre à une autre personne de comprendre la décision sans la reconstituer à partir des journaux.

L’enregistrement des sorties est une responsabilité distincte

Dans le processus programmatique documenté, nbformat.write enregistre le notebook séparément de l’exécution. Prévoyez une destination qui préserve l’original et signalez séparément les échecs de persistance. Si vous souhaitez déclarer une exécution avec un nouveau noyau, exigez un noyau explicitement neuf et sous votre contrôle, au lieu de supposer qu’il l’est.

Les recommandations de nbclient sur les widgets posent une autre limite utile : l’exécution n’effectue pas le rendu des widgets dans un navigateur. L’état enregistré des widgets ne permet donc pas d’établir qu’une sortie interactive fonctionne dans l’outil de visualisation prévu. Vérifiez ces sorties dans cet outil, ou indiquez qu’elles n’ont pas été testées.

Éviter les erreurs qu’une réexécution avec un nouveau noyau ne peut pas corriger

Erreurs courantes lors de la transmission

Il est facile de confondre un graphique enregistré avec le résultat d’une exécution actuelle. Une variable de console non documentée est plus difficile à repérer, mais elle crée le même problème pratique : le destinataire doit deviner comment le résultat a été produit. Considérer l’exécution de toutes les cellules comme une réinitialisation ajoute une autre hypothèse non étayée.

Écraser le notebook reçu supprime le point de comparaison. Omettre les cellules en échec masque des éléments dont la personne suivante a besoin. Préservez à la fois le code source et un compte rendu honnête de la tentative, même lorsque le résultat manque de netteté.

Le mécanisme de confiance des notebooks répond à une autre question. La documentation de JupyterLab sur la confiance concerne l’assainissement du HTML et l’affichage des sorties interactives. Lue parallèlement au modèle de sécurité du serveur, elle explique pourquoi accorder sa confiance à un notebook n’isole pas son code dans un bac à sable et ne valide pas son analyse. Faire apparaître une sortie enrichie bloquée n’est pas une raison d’accorder sa confiance à un notebook inconnu sans l’examiner.

Limites de la reproductibilité, de la confiance et des services externes

L’article de PLOS publié en 2019, Dix règles simples pour rédiger et partager des analyses informatiques dans des notebooks Jupyter, fournit un cadre méthodologique pour documenter les dépendances, les données et les étapes d’analyse. Utilisez-le dans ce rôle. Il ne constitue pas une preuve d’une version actuelle du produit ni d’un déploiement d’Optijara.

Les références bibliographiques ont leur propre place dans la transmission. Préserver les références de recherche avec Zotero peut faciliter la traçabilité bibliographique, tout en laissant les calculs et l’exécution faire l’objet de vérifications séparées.

Une exécution ultérieure peut utiliser d’autres dépendances ou entrées. L’état du générateur aléatoire et les services externes doivent également être pris en compte dans la discussion sur la reproductibilité, en particulier lorsqu’un identifiant de modèle ne garantit pas des réponses futures identiques. Documentez ce que vous savez au lieu de promettre que le notebook sera reproductible partout.

Réexécuter a également un coût opérationnel. Examinez les frais de service et les questions de confidentialité avant l’exécution, et excluez les entrées privées et les identifiants d’accès du compte rendu de transmission. Partagez le contexte soumis à restrictions au moyen de contrôles d’accès approuvés. Le livrable utile est un compte rendu précis de ce qui a été tenté, avec suffisamment de contexte pour évaluer le résultat et des limites claires sur ce qui n’a pas été testé.

Points clés

  • 1Les sorties enregistrées, le contexte du noyau actif et les preuves d’une nouvelle exécution répondent à des questions différentes lors de la transmission.
  • 2Effacer les sorties, redémarrer et exécuter toutes les cellules sont des opérations distinctes, et non des réinitialisations interchangeables.
  • 3Préservez le notebook reçu et autorisez son exécution séparément de son ouverture ou de l’octroi de confiance.
  • 4Examinez le résultat réel et enregistrez séparément une copie exécutée et examinée lorsqu’une réexécution est appropriée.
  • 5Consignez le code source, le noyau, le répertoire de travail, les dépendances, les entrées, la politique de gestion des erreurs et le contexte manquant.
  • 6Une exécution réussie avec un nouveau noyau ne prouve ni l’exactitude de l’analyse, ni la sécurité du code, ni une reproductibilité universelle.

Conclusion

La transmission d’un notebook doit permettre à la personne suivante de comprendre ce qui s’est passé sans avoir à deviner. Distinguez le document enregistré de ce que vous savez du noyau actif. Si une nouvelle exécution séquentielle est autorisée, examinez le résultat et enregistrez séparément la copie exécutée. Si elle échoue, s’arrête prématurément ou ne peut pas être tentée, indiquez-le.

La méthode de transmission à trois états structure ce compte rendu. Elle ne certifie pas l’analyse : même une réexécution menée à terme reste un élément de preuve dans un environnement documenté, avec des éléments de contexte manquants et des sorties non testées qui restent à vérifier. Si votre équipe a besoin d’une liste de contrôle adaptée, discutez avec Optijara de vos exigences de transmission des notebooks.

Questions fréquentes

Les sorties enregistrées d’un notebook Jupyter prouvent-elles que le code actuel a été exécuté ?

Non. Un notebook peut conserver des sorties à côté d’un code source qui a été modifié depuis. Les résultats visibles et les compteurs d’exécution enregistrés ne suffisent pas à établir une exécution séquentielle récente du code source enregistré. Demandez quel code source et quelles entrées ont produit les sorties fournies.

Fermer un notebook JupyterLab arrête-t-il son noyau ?

Non. La documentation de JupyterLab indique que le noyau sous-jacent continue de fonctionner lorsque le document est fermé. Gérez le noyau séparément au moyen des commandes appropriées, notamment le panneau des sessions actives. Fermer une vue ne prouve pas que son état d’exécution a été réinitialisé.

Exécuter toutes les cellules revient-il à redémarrer le noyau puis à exécuter toutes les cellules ?

Non. L’exécution de toutes les cellules ne demande pas, à elle seule, de nouveau noyau. L’action de redémarrage du noyau suivie de l’exécution de toutes les cellules ajoute cette étape. Observez la fin de l’exécution et examinez les erreurs avant de communiquer le résultat ; l’opération utilise toujours l’environnement sélectionné et ne prouve pas une reproduction indépendante.

Que faut-il joindre à un notebook exécuté avec nbclient, et qu’établit une réussite ?

Incluez le code source préservé, un artefact exécuté enregistré séparément lorsqu’il est disponible, les détails du noyau et du répertoire de travail, les références des dépendances et des entrées, la politique de gestion des erreurs et le résultat réel. Identifiez le contexte manquant et les sorties, comme les widgets interactifs, qui n’ont pas été vérifiées dans un navigateur. Une exécution achevée avec un nouveau noyau permet une affirmation limitée sur l’exécution dans ce contexte documenté, sans garantir l’exactitude de l’analyse ni la reproductibilité partout. Consultez le [guide d’exécution de nbclient](https://nbclient.readthedocs.io/en/latest/client.html) et les [recommandations de PLOS sur le partage des notebooks](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1007007).

Accorder sa confiance à un notebook le rend-il sûr ou valide-t-il ses résultats ?

Non. La confiance concerne le traitement des sorties du notebook. Elle n’isole pas le code arbitraire dans un bac à sable et n’établit pas l’exactitude de l’analyse. Examinez les notebooks inconnus et autorisez leur exécution séparément. Accorder sa confiance à un notebook uniquement pour afficher une sortie bloquée ne remplace pas cet examen.

Sources

Partager cet article

Hamza Diaz

Rédigé par

Hamza Diaz

Hamza Diaz est le fondateur d’Optijara, où il conçoit des agents IA pratiques, des systèmes d’automatisation et des workflows Copilot pour les entreprises de services. Il écrit sur les opérations IA, la stratégie d’agents et la mise en œuvre concrète pour les équipes qui veulent des systèmes utiles plutôt que du battage médiatique.