12

I am currently using Python3 in Jupyter Notebook and I just ran into a keyword exit. What does this keyword do ?

with open("some_file.txt") as f:
    for lines in f:
        print(lines)
        exit
3
  • 2
    Undoing my dupe-close because apparently this behaves differently in Jupyter/IPython. Commented Dec 7, 2018 at 19:57
  • Is that exit something specific to jupyter? Normally in python the code uses sys.exit(). Whatever this does it will do it for every line read from the file. Commented Dec 7, 2018 at 20:02
  • exit is not a key-word. Commented Dec 7, 2018 at 20:08

3 Answers 3

9

The exit lines in your loop do nothing. Why they do nothing is a bit more complicated than the usual reason exit would do nothing in Python, though.


Normally, exit on a line by its own wouldn't exit Python. At most, in interactive mode, it would print a message telling you how to quit Python (message implemented in _sitebuiltins.Quitter.__repr__):

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit

IPython does something different. Among the many extra systems IPython has for interactive convenience is a system to autocall instances of a certain type, IPython.core.autocall.IPyAutocall. (This is similar to but distinct from the %autocall magic.)

In IPython, exit and quit are set to instances of IPython.core.autocall.ExitAutocall, a subclass of IPyAutocall. IPython recognizes objects of this type, so when a line containing just exit or quit is executed, IPython actually exits.

In [1]: exit
[IPython dies here]

A Jupyter notebook's IPython kernel has exit and quit set to instances of the very closely related IPython.core.autocall.ZMQExitAutocall, which has some extra functionality to support a keep_kernel argument, but is otherwise the same.

This functionality only triggers when a line referring to the autocallable object is the entire content of the cell, though. Inside a loop, the autocall functionality doesn't trigger, so we're back to nothing happening.

In fact, even less happens than what would happen in normal interactive mode - in a normal, non-IPython interactive session, this loop would print the "Use exit()..." message on each iteration, due to differences in how IPython and the regular interactive mode handle expression auto-printing.

Sign up to request clarification or add additional context in comments.

3 Comments

It also has an optional parameter to keep the kernel running - github.com/jupyter/jupyter_console/issues/…
@Kingsley which I assume Spyder is doing in my case, and I suspect Jupyter would invoke by default. I can't see much use for this other than a wipe of the namespace otherwise. If you actually shut the IPython kernel down then you can't do a whole lot
Actually, it might be a part of IPython.core.autocall.ZMQExitAutocall The behaviour and the parameter seems to support it.
4

On my simple test,
Cell 1
a = 3
Cell 2
exit
cell 3
print(a)

resulted in

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-3f786850e387> in <module>
----> 1 a

NameError: name 'a' is not defined

exit just kills the kernel that the notebook is relying on for execution.

Interestingly enough however, There seems to be a parameter you can pass to modify that behaviour as well.

Test 2: Cell 1
a = 3
Cell 2
exit(keep_kernel=True)
cell 3
print(a) resulted in 3

EDIT: And looks like @user2357112's answer fills in the missing pieces.
EDIT2: Actually, it seems to be an instance of IPython.core.autocall.ZMQExitAutocall

 class IPython.core.autocall.ZMQExitAutocall(ip=None)

    Bases: IPython.core.autocall.ExitAutocall

    Exit IPython. Autocallable, so it needn’t be explicitly called.
    Parameters: keep_kernel (bool) – If True, leave the kernel alive. Otherwise, tell the kernel to exit too (default).

3 Comments

Ah nice. I was trying to work out what this might do. So it looks like, from your test, it wipes the namespace?
In Spyder it is restarting the IPython kernel. You already have my upvote, but I think you could do with adding the documentation for this (my lame way of backing out of a fiddly google search :P)
mhm, i am actually really intrigued by this behaviour, tracking down the documentation atm, however check the edit. @roganjosh It makes me suspect it is doing something not just with namespaces.
4

When exit (sic, with no parentheses) is used in iPython in a loop or a branch of a conditional statement, it is doing nothing because it is simply a reference to an instance of IPython.core.autocall.ExitAutocall:

for i in range(10): 
    exit 
print(i)
# 9

if i==9: 
   exit 
   print(exit)    
# <IPython.core.autocall.ExitAutocall object at 0x7f76ad78a4a8>      

It does not restart the kernel:

print(i)
# 9

However, when used on the command line alone, it is treated as a kind of magic (though without a %) and terminates the kernel.

9 Comments

No, it really isn't sic. It does do something in IPython
I can run it in the IPython console and it forces a reset in Spyder
No, it looks like this is right - the loop changes things in a way I didn't account for. I need to revise my answer a bit more.
@roganjosh Like it is doing what?
@roganjosh Pretty much so. Just like any other reference to an object or a function.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.