IPython Notebook - 提前退出单元格

问题描述 投票:35回答:3

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

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

python ipython ipython-notebook
3个回答
18
投票

略微更“适当”的选择:

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

raise KeyboardInterrupt

你的一个更干净的版本:

assert(False)

或者干脆:

raise

如果你想节省一些按键。


11
投票

我正在回复here的回答,因为解决方案也适用于你的问题。它会...

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

只需从下面的代码中导入“退出”到您的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

4
投票

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

print(variable_to_query)
() + 1

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

© www.soinside.com 2019 - 2024. All rights reserved.