web-dev-qa-db-fra.com

Laisser le carnet de notes Jupyter actif après la fermeture de l'onglet du navigateur

J'utilise Jupyter Notebook pour effectuer une série d'expériences qui prennent un certain temps… .. Certaines cellules prennent beaucoup trop de temps à s'exécuter, il est donc normal que j'aimerais fermer l'onglet du navigateur et revenir plus tard. Mais quand je fais le noyau interrompt en cours d'exécution.

Je suppose qu'il existe une solution de contournement pour cela mais je ne le trouve pas

25
Fotis

La solution la plus simple à cette solution semble être la magie de cellule intégrée %%capture:

%%capture output
# Time-consuming code here

Enregistrer, fermez l'onglet, revenez plus tard. La sortie est maintenant stockée dans la variable output:

output.show()

Ceci affichera tous les résultats intermédiaires print ainsi que la cellule de sortie simple ou riche.

21
Seb

TL; DR:

Le code ne s'arrête pas lorsque l'onglet se ferme, mais la sortie ne peut plus trouver la session de navigateur en cours et perd des données sur la façon dont elle est censée être affichée, ce qui la supprime toutes les nouvelles sorties reçues jusqu'à la fin du code en cours d'exécution lorsque l'onglet fermé.

Version longue:

Malheureusement, ceci n'est pas implémenté (24 novembre). S'il y a une solution de contournement, je ne la trouve pas non plus. (Toujours à la recherche, mise à jour avec les nouvelles.) Il existe une solution de contournement qui enregistre la sortie puis la réimprime , mais ne fonctionnera pas si le code est toujours en cours d'exécution dans ce bloc-notes. Une alternative serait d'avoir un second cahier dans lequel vous pouvez obtenir la sortie.

J'ai aussi besoin de cette fonctionnalité, et pour la même raison. Le noyau ne s’arrête pas ou l’interruption sur on ferme. Et le code ne cesse pas de s'exécuter lorsque vous fermez un onglet. L'avertissement donné est exactement correct, "Le noyau est occupé, les sorties peuvent être perdues."

Fonctionnement

import time
a = 0
while a < 100:
    a+=1
    print(a)
    time.sleep(1)

dans une boîte, puis fermez l'onglet, ouvrez-le à nouveau, puis exécutez

print(a)

à partir d’une autre boîte, il se bloque jusqu’à ce que les 100 secondes soient écoulées et que le code soit complet, puis il en imprimera 100.

Quand un onglet est fermé, lorsque vous revenez, le processus python sera dans le même état que vous l'avez laissé (lorsque le dernier enregistrement est terminé). C'était leur comportement prévu et ce sur quoi ils auraient dû être plus clairs dans leur documentation. La sortie du code d'exécution est en fait envoyée au navigateur lors de sa réouverture (perd la référence qui l'explique), aussi des hacks comme celui de ce commentaire fonctionneront-ils, car ils peuvent les recevoir et les jeter dans un cellule.

La sortie est en quelque sorte enregistrée uniquement de manière accessible via la connexion au point final. Ils y travaillent depuis un moment (avant Jupyter) , bien que je ne trouve pas le bogue actuel dans le référentiel Jupyter ( celui-ci le référence, mais ne l'est pas ).

La seule solution générale semble être de trouver un ordinateur sur lequel vous pouvez toujours rester allumé et de le laisser sur la page pendant son exécution, puis de le laisser à distance ou de vous fier à la sauvegarde automatique pour pouvoir y accéder ailleurs. C'est une mauvaise façon de le faire, mais malheureusement, c'est ce que je dois faire pour l'instant.

Questions connexes:

10
Poik

Je suis également aux prises avec ce problème depuis quelque temps déjà. 

Ma solution consistait à écrire tous mes journaux dans un fichier. Ainsi, lorsque mon navigateur se ferme (même lorsque de nombreux journaux arrivent par le navigateur, il se bloque également), je peux voir le processus de travail du noyau en ouvrant être ouvert avec Jupyter aussi).

#!/usr/bin/python
import time
import datetime
import logging

logger = logging.getLogger()

def setup_file_logger(log_file):
    hdlr = logging.FileHandler(log_file)
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr) 
    logger.setLevel(logging.INFO)

def log(message):
    #outputs to Jupyter console
    print('{} {}'.format(datetime.datetime.now(), message))
    #outputs to file
    logger.info(message)

setup_file_logger('out.log')

for i in range(10000):
    log('Doing hard work here i=' + str(i))
    log('Taking a nap now...')
    time.sleep(1000)
2
flaviostutz

Tout d'abord, installez 

runipy

pip install runipy

Et maintenant, lancez votre bloc-notes en arrière-plan avec la commande ci-dessous:

Nohup runipy YourNotebook.ipynb OutputNotebook.ipynb >> notebook.log &

maintenant le fichier de sortie sera sauvegardé et vous pourrez aussi voir les journaux lors de l'exécution avec:

tail -f notebook.log
0
Saitejareddy