Adam Smith
Adam Smith

Reputation: 511

Stopping Program in Jupyter

I'm using the Jupyter (previously iPython Notebooks) environment, with Python 3, and I want a program to terminate early.

Usually in Python, I'd just do a raise SystemExit or sys.exit().

However, in the Jupyter environment, I'm stuck with the ugly message "An exception has occurred, use %tb to see the full traceback." Is there a way in Jupyter to just tell the program to terminate immediately, without error?

Thanks.

Upvotes: 6

Views: 4107

Answers (3)

Shadi
Shadi

Reputation: 10335

If you're running the notebook programatically with nbconvert, consider setting up a custom Exception (or something like KeyboardInterrupt), raising it in the notebook, running the notebook using the nbconvert python api (ref), catching the exception, and not bubbling it.

Example (untested) code:

Notebook notebook.ipynb:

Cell 1: print("foo")
Cell 2: from main import EarlyReturn; raise EarlyReturn
Cell 3: print("bar")

main.py:

class EarlyReturn(Exception):
    pass


def run_notebook(notebook_filename):
    import nbformat
    from nbconvert.preprocessors import ExecutePreprocessor
    from nbconvert.preprocessors import CellExecutionError

    with open(notebook_filename) as f:
        nb = nbformat.read(f, as_version=4)

    ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
    try:
        ep.preprocess(nb, {'metadata': {'path': 'notebooks/'}})
    except CellExecutionError as e:
        if e.ename == 'EarlyReturn':
            pass
        else:
            msg = 'Error executing the notebook "%s".\n\n' % notebook_filename
            msg += 'See notebook "%s" for the traceback.\n\n' % "executed_notebook.ipynb"
            print(msg)
            raise

    finally:
        with open('executed_notebook.ipynb', 'w', encoding='utf-8') as f:
            nbformat.write(nb, f)


if __name__ == '__main__':
    run_notebook('notebook.ipynb')

and run the notebook as: python3 main.py

Upvotes: 1

Matthew Hall
Matthew Hall

Reputation: 31

I recently had this same problem. My solution is to use return like this:

if __name__ == '__main__':
    # Some code
    if something_went_wrong:
        return

    # Carry on if nothing happened.

This allows the code to stop without killing the kernel or giving you the ugly stack trace.

Upvotes: 3

user6257803
user6257803

Reputation:

If you're using the web interface, simply hit the interrupt kernel button in the toolbar. This throws a KeyboardInterrupt and immediately stops execution of the cell.

Upvotes: 0

Related Questions