Reputation: 511
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
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
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
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