web-dev-qa-db-fra.com

Bloc-notes IPython - sortie anticipée de la cellule

Je voudrais quitter une cellule par programme au début du bloc-notes IPython. exit(0), cependant, tue le noyau.

Quelle est la bonne façon de procéder? Je préfère ne pas diviser la cellule ou arrêter manuellement l'exécution.

43
watsonic

Je republie ma réponse de ici parce que la solution devrait également s'appliquer à votre question. Ce sera...

  • ne pas tuer le noyau à la sortie
  • ne pas afficher de traceback complète (pas de traceback pour une utilisation dans IPython Shell)
  • ne pas vous forcer à introduire du code avec try/excepts
  • travailler avec ou sans IPython, sans changement de code

Importez simplement 'exit' du code ci-dessous dans votre cahier jupyter (cahier IPython) et appeler 'exit ()' devrait fonctionner. Il sortira et vous fera savoir que ...

 An exception has occurred, use %tb to see the full traceback.

 IpyExit 

"""
# ipython_exit.py
Allows exit() to work if script is invoked with IPython without
raising NameError Exception. Keeps kernel alive.

Use: import variable 'exit' in target script with
     'from ipython_exit import exit'    
"""

import sys
from io import StringIO
from IPython import get_ipython


class IpyExit(SystemExit):
    """Exit Exception for IPython.

    Exception temporarily redirects stderr to buffer.
    """
    def __init__(self):
        # print("exiting")  # optionally print some message to stdout, too
        # ... or do other stuff before exit
        sys.stderr = StringIO()

    def __del__(self):
        sys.stderr.close()
        sys.stderr = sys.__stderr__  # restore from backup


def ipy_exit():
    raise IpyExit


if get_ipython():    # ...run with IPython
    exit = ipy_exit  # rebind to custom exit
else:
    exit = exit      # just make exit importable
14
Darkonaut

Options légèrement plus "correctes":

Cela vous permettra de sortir de tous les blocs, sauf le pire.

raise KeyboardInterrupt

Une petite version plus propre de la vôtre:

assert(False)

ou simplement:

raise

si vous souhaitez enregistrer quelques frappes.

23
Paul

C'est loin d'être "correct" mais une façon de sortir tôt est de créer une erreur d'exécution. Donc, au lieu de retourner tôt à partir d'un script proprement avec exit(0) on peut retourner impur avec quelque chose comme

print(variable_to_query)
() + 1

qui exécutera le code jusqu'à ce point (en terminant l'instruction d'impression), puis échouera.

3
watsonic

Pour arrêter silencieusement les cellules actuelles et suivantes:

class StopExecution(Exception):
    def _render_traceback_(self):
        pass

raise StopExecution
2
Samuel Rizzo