IPython Notebook - 提前退出单元格

时间:2014-06-03 00:09:35

标签: python ipython ipython-notebook

我希望以编程方式在IPython Notebook早期退出单元格。但是,exit(0)会杀死内核。

这样做的正确方法是什么?我不想拆分单元格或手动停止执行。

4 个答案:

答案 0 :(得分:19)

略多"适当"选项:

除了最差的try / except块之外,这将让你脱离所有。

raise KeyboardInterrupt

你的一个更干净的版本:

assert(False)

或简单地说:

raise

如果你想保存几次按键。

答案 1 :(得分:11)

我正在重新发布here的答案,因为解决方案也适用于您的问题。它会......

  • 在退出时不杀死内核
  • 不显示完整的回溯(没有在IPython shell中使用的回溯)
  • 不要强迫您使用try / excepts来巩固代码
  • 使用或不使用IPython,无需更改代码

只需从下面的代码中导入'exit'进入你的jupyter笔记本(IPython笔记本)并调用'exit()'即可。它会退出并让你知道......

 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

答案 2 :(得分:4)

这远非“正确”,但提前退出的一种方法是创建运行时错误。因此,不是使用exit(0)干净地从脚本中提前返回,而是可以使用类似

之类的内容返回。
print(variable_to_query)
() + 1

将运行代码直到此时(完成print语句)然后失败。

答案 3 :(得分:2)

要安静地停止当前和随后的单元格:

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

raise StopExecution