我想在IPython Notebook中以编程方式提前退出一个单元格。然而,exit(0)
会关闭内核。
有什么正确的方法吗?我不想拆分单元格或手动停止执行。
注: - IPython 是一个交互式计算、数据分析、可视化和编程环境,是 Python 的增强版。 - 单元格是 IPython Notebook 中的基本单位,可以在其中输入和运行代码,并且可以包含其他类型的内容(如文本、图像等)。我想在IPython Notebook中以编程方式提前退出一个单元格。然而,exit(0)
会关闭内核。
有什么正确的方法吗?我不想拆分单元格或手动停止执行。
注: - IPython 是一个交互式计算、数据分析、可视化和编程环境,是 Python 的增强版。 - 单元格是 IPython Notebook 中的基本单位,可以在其中输入和运行代码,并且可以包含其他类型的内容(如文本、图像等)。稍微更“正规”的选项:
这将使你摆脱除了最糟糕的try/except块之外的所有问题。
raise KeyboardInterrupt
您的版本稍微简洁一些:
assert(False)
或者简单地说:
raise
如果您想节省几次按键。
class StopExecution(Exception):
def _render_traceback_(self):
return []
raise StopExecution
_render_traceback_
应该返回字符串列表。因此,该方法应该使用 return []
而不是 pass
。当使用 nbconvert 时,使用 pass
会导致异常。 - Stan我将我的回答从这里转载,因为解决方案也适用于你的问题。它将:
只需从下面的代码中导入 '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
并不是说这是一个好主意,但你可以使用单次迭代循环包装单元格的开始,然后调用“break”停止进一步执行。
for _ in range(1):
# do some stuff
if some_condition:
break
这并不是“规范”的做法,但一种早期退出的方法是创建运行时错误。因此,与使用exit(0)
干净地从脚本返回不同,可以使用以下类似方式不干净地返回
print(variable_to_query)
() + 1
这将运行代码直到此时(完成打印语句),然后失败。
def func:
if x==y:
return
return None
提前退出 - 而不会抛出错误。 - Charlie