关于python:IPython Notebook – 提前退出单元格

IPython Notebook - early exit from cell

我想以编程方式在IPython Notebook早期退出单元格。 然而,exit(0)会杀死内核。

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


略微更"适当"的选择:

除了最差的try / except块之外,这将使你除外。

1
raise KeyboardInterrupt

你的一个更干净的版本:

1
assert(False)

或者干脆:

1
raise

如果你想节省一些按键。


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

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

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

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

 IpyExit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
"""
# 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


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

1
2
print(variable_to_query)
() + 1

这将运行代码直到这一点(完成print语句)然后失败。


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

1
2
3
4
5
class StopExecution(Exception):
    def _render_traceback_(self):
        pass

raise StopExecution