我希望以编程方式在IPython Notebook早期退出单元格。但是,exit(0)
会杀死内核。
这样做的正确方法是什么?我不想拆分单元格或手动停止执行。
答案 0 :(得分:19)
略多"适当"选项:
除了最差的try / except块之外,这将让你脱离所有。
raise KeyboardInterrupt
你的一个更干净的版本:
assert(False)
或简单地说:
raise
如果你想保存几次按键。
答案 1 :(得分:11)
我正在重新发布here的答案,因为解决方案也适用于您的问题。它会......
只需从下面的代码中导入'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