# IPython: an environment for interactive computing¶

Based on Introduction to IPYthon Notebook by Fernando Perez, minor modifications Hans Fangohr, Sep 2013. Update to Python 3, September 2016.

## What is IPython?¶

• Short for Interactive Python
• A platform for you to interact with your code and data
• The notebook: a system for literate computing
• The combination of narrative, code and results
• Tools for easy parallel computing
• Interact with many processes

# IPython at the terminal¶

The basic IPython client: at the terminal, simply type ipython:

$ipython Python 3.5.1 |Anaconda 4.0.0 (x86_64)| (default, Dec 7 2015, 11:24:55) Type "copyright", "credits" or "license" for more information. IPython 4.1.2 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]:  # The IPython book¶ ## Also introduces Numpy, Pandas and Matplotlib The IPython book # Some other tutorial help/resources :¶ # IPython: beyond plain Python¶ When executing code in IPython, all valid Python syntax works as-is, but IPython provides a number of features designed to make the interactive experience more fluid and efficient. ## First things first: running code, getting help¶ In the notebook, to run a cell of code, hit Shift-Enter. This executes the cell and puts the cursor in the next cell below, or makes a new one if you are at the end. Alternately, you can use: • Alt-Enter to force the creation of a new cell unconditionally (useful when inserting new content in the middle of an existing notebook). • Control-Enter executes the cell and keeps the cursor in the same cell, useful for quick experimentation of snippets that you don't need to keep permanently. In [1]: print("Hello")  Hello  ## Getting help¶ In [ ]: ?  ## Help with ?¶ Typing object_name? will print all sorts of details about any object, including docstrings, function definition lines (for call arguments) and constructor details for classes. In [2]: import scipy.optimize scipy.optimize.bisect?  In [3]: scipy.optimize?  In [4]: *int*?  An IPython quick reference card: In [5]: %quickref  ## Tab completion¶ Tab completion, especially for attributes, is a convenient way to explore the structure of any object you’re dealing with. Simply type object_name.<TAB> to view the object’s attributes. Besides Python objects and keywords, tab completion also works on file and directory names. In [6]: import collections  In [ ]: collections.  ## The interactive workflow: input, output, history¶ In [7]: 2 + 10  Out[7]: 12 In [8]: _ + 10  Out[8]: 22 ## Output control¶ You can suppress the storage and rendering of output if you append ; to the last cell (this comes in handy when plotting with matplotlib, for example): In [9]: 10 + 20;  In [10]: _  Out[10]: 22 ## Output history¶ The output is stored in _N and Out[N] variables: In [11]: _8 == Out[8]  Out[11]: True In [12]: Out  Out[12]: {7: 12, 8: 22, 10: 22, 11: True} And the last three have shorthands for convenience: In [13]: print('last output:', _) print('next one :', __) print('and next :', ___)  last output: True next one : 22 and next : 22  ## The input history is also available¶ In [14]: In[11]  Out[14]: '_8 == Out[8]' In [15]: _i  Out[15]: 'In[11]' In [16]: _ii  Out[16]: 'In[11]' In [17]: print('last input:', _i) print('next one :', _ii) print('and next :', _iii)  last input: _ii next one : _i and next : In[11]  In [18]: %history  print("Hello") import scipy.optimize scipy.optimize.bisect? scipy.optimize? *int*? %quickref import collections 2 + 10 _ + 10 10 + 20; _ _8 == Out[8] Out print('last output:', _) print('next one :', __) print('and next :', ___) In[11] _i _ii print('last input:', _i) print('next one :', _ii) print('and next :', _iii) %history  # Accessing the underlying operating system¶ Note: the commands below work on Linux or Macs, but may behave differently on Windows, as the underlying OS is different. IPython's ability to access the OS is still the same, it's just the syntax that varies per OS. In [19]: !pwd  /Users/fangohr/hg/teaching-python/notebook  In [20]: files = !ls print("My current directory's files:") print(files)  My current directory's files: ['IPython-beyond-plain-Python-Fernando-Perez.ipynb', 'IPythonNotebookIntroduction.html', 'IPythonNotebookIntroduction.ipynb', 'Makefile', 'Matplotlib.html', 'Matplotlib.ipynb', 'Testing-intro.ipynb', '__pycache__', 'helloworld.py', 'inverse-function-through-rootfinding.ipynb', 'lab1.ipynb', 'lab1.pdf', 'lab2.ipynb', 'lab3.ipynb', 'lab4.ipynb', 'lab5.ipynb', 'lab6.ipynb', 'lab7.ipynb', 'lab8.ipynb', 'mod.py', 'same-or-differents-object.ipynb', 'speed-map-vs-for-loop.ipynb', 'test.txt', 'update-web.sh']  In [21]: !echo$files

[IPython-beyond-plain-Python-Fernando-Perez.ipynb, IPythonNotebookIntroduction.html, IPythonNotebookIntroduction.ipynb, Makefile, Matplotlib.html, Matplotlib.ipynb, Testing-intro.ipynb, __pycache__, helloworld.py, inverse-function-through-rootfinding.ipynb, lab1.ipynb, lab1.pdf, lab2.ipynb, lab3.ipynb, lab4.ipynb, lab5.ipynb, lab6.ipynb, lab7.ipynb, lab8.ipynb, mod.py, same-or-differents-object.ipynb, speed-map-vs-for-loop.ipynb, test.txt, update-web.sh]

In [22]:
!echo {files[0].upper()}

IPYTHON-BEYOND-PLAIN-PYTHON-FERNANDO-PEREZ.IPYNB


## Beyond Python: magic functions¶

The IPython 'magic' functions are a set of commands, invoked by prepending one or two % signs to their name, that live in a namespace separate from your normal Python variables and provide a more command-like interface. They take flags with -- and arguments without quotes, parentheses or commas. The motivation behind this system is two-fold:

• To provide an orthogonal namespace for controlling IPython itself and exposing other system-oriented functionality.

• To expose a calling mode that requires minimal verbosity and typing while working interactively. Thus the inspiration taken from the classic Unix shell style for commands.

In [23]:
%magic


Line vs cell magics:

In [24]:
%timeit range(10)

The slowest run took 4.48 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 276 ns per loop

In [25]:
%%timeit
range(10)
range(100)

1000000 loops, best of 3: 571 ns per loop


Line magics can be used even inside code blocks:

In [26]:
for i in range(5):
size = i*100
print('size:',size)
%timeit range(size)

size: 0
The slowest run took 5.83 times longer than the fastest. This could mean that an intermediate result is being cached.
10000000 loops, best of 3: 194 ns per loop
size: 100
The slowest run took 4.54 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 301 ns per loop
size: 200
1000000 loops, best of 3: 299 ns per loop
size: 300
The slowest run took 6.27 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 339 ns per loop
size: 400
1000000 loops, best of 3: 343 ns per loop


Magics can do anything they want with their input, so it doesn't have to be valid Python:

In [27]:
%%bash
echo "My shell is:" $SHELL echo "My system uptime is:" uptime  My shell is: /bin/bash My system uptime is: 15:06 up 11 days, 2:33, 12 users, load averages: 2.01 1.98 2.06  Another interesting cell magic: create any file you want locally from the notebook: In [28]: %%file test.txt This is a test file! It can contain anything I want... more...  Overwriting test.txt  In [29]: !cat test.txt  This is a test file! It can contain anything I want... more... Let's see what other magics are currently defined in the system: In [30]: %lsmagic  Out[30]: Available line magics: %alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode Available cell magics: %%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile Automagic is ON, % prefix IS NOT needed for line magics. ## Running normal Python code: execution and errors¶ Not only can you input normal Python code, you can even paste straight from a Python or IPython shell session: In [31]: >>> # Fibonacci series: ... # the sum of two elements defines the next ... a, b = 0, 1 >>> while b < 10: ... print(b) ... a, b = b, a+b  1 1 2 3 5 8  In [32]: In [1]: for i in range(10): ...: print(i, end=' ') ...:  0 1 2 3 4 5 6 7 8 9  ## Error display¶ And when your code produces errors, you can control how they are displayed with the %xmode magic: In [33]: %%file mod.py def f(x): return 1.0/(x-1) def g(y): return f(y+1)  Overwriting mod.py  Now let's call the function g with an argument that would produce an error: In [34]: import mod mod.g(0)  --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-34-a54c5799f57e> in <module>() 1 import mod ----> 2 mod.g(0) /Users/fangohr/hg/teaching-python/notebook/mod.py in g(y) 4 5 def g(y): ----> 6 return f(y+1) /Users/fangohr/hg/teaching-python/notebook/mod.py in f(x) 1 2 def f(x): ----> 3 return 1.0/(x-1) 4 5 def g(y): ZeroDivisionError: float division by zero ## Plain exceptions¶ In [35]: %xmode plain mod.g(0)  Exception reporting mode: Plain  Traceback (most recent call last): File "<ipython-input-35-8932f4bf53fa>", line 2, in <module> mod.g(0) File "/Users/fangohr/hg/teaching-python/notebook/mod.py", line 6, in g return f(y+1) File "/Users/fangohr/hg/teaching-python/notebook/mod.py", line 3, in f return 1.0/(x-1) ZeroDivisionError: float division by zero  ## Verbose exceptions¶ In [36]: %xmode verbose mod.g(0)  Exception reporting mode: Verbose  --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-36-539f73e80e01> in <module>() 1 get_ipython().magic('xmode verbose') ----> 2 mod.g(0) global mod.g = <function g at 0x10a5e9b70> /Users/fangohr/hg/teaching-python/notebook/mod.py in g(y=0) 4 5 def g(y): ----> 6 return f(y+1) global f = <function f at 0x10a5e9d08> y = 0 /Users/fangohr/hg/teaching-python/notebook/mod.py in f(x=1) 1 2 def f(x): ----> 3 return 1.0/(x-1) x = 1 4 5 def g(y): ZeroDivisionError: float division by zero The default %xmode is "context", which shows additional context but not all local variables. Let's restore that one for the rest of our session. In [37]: %xmode context  Exception reporting mode: Context  ## Raw Input in the notebook¶ Since 1.0 the IPython notebook web application support raw_input which for example allow us to invoke the %debug magic in the notebook: In [38]: mod.g(0)  --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-38-5e708f13c839> in <module>() ----> 1 mod.g(0) /Users/fangohr/hg/teaching-python/notebook/mod.py in g(y) 4 5 def g(y): ----> 6 return f(y+1) /Users/fangohr/hg/teaching-python/notebook/mod.py in f(x) 1 2 def f(x): ----> 3 return 1.0/(x-1) 4 5 def g(y): ZeroDivisionError: float division by zero In [39]: %debug  > /Users/fangohr/hg/teaching-python/notebook/mod.py(3)f() 1 2 def f(x): ----> 3 return 1.0/(x-1) 4 5 def g(y): ipdb> p x 1 ipdb> exit  Don't foget to exit your debugging session. Raw input can of course be use to ask for user input: In [40]: enjoy = input('Are you enjoying this tutorial ?') print('enjoy is :', enjoy)  Are you enjoying this tutorial ?mostly enjoy is : mostly  ## Plotting in the notebook¶ This imports numpy as np and matplotlib's plotting routines as plt, plus setting lots of other stuff for you to work interactivel very easily: In [41]: %matplotlib inline  In [42]: import numpy as np import matplotlib.pyplot as plt from matplotlib.pyplot import gcf  In [43]: x = np.linspace(0, 2*np.pi, 300) y = np.sin(x**2) plt.plot(x, y) plt.title("A little chirp") f = gcf() # let's keep the figure object around for later...  ## The IPython kernel/client model¶ We can also run an IPYthon notebook on a server, and connect to that notebook session remotely or from the local machine. This magic gives us some details: In [44]: %connect_info  { "control_port": 57843, "signature_scheme": "hmac-sha256", "key": "6db37163-d219-40eb-89b1-b6de8ac47715", "iopub_port": 57841, "hb_port": 57844, "transport": "tcp", "stdin_port": 57842, "ip": "127.0.0.1", "shell_port": 57840, "kernel_name": "" } Paste the above JSON into a file, and connect with:$> ipython <app> --existing <file>
or, if you are local, you can connect with just:
$> ipython <app> --existing /Users/fangohr/Library/Jupyter/runtime/kernel-bd50837b-7b59-4e0d-91eb-7eda64d01d22.json or even just:$> ipython <app> --existing
if this is the most recent IPython session you have started.


So for example we can open a text-based ipython console connected to this session using:

!jupyter console --existing

Or open a QTConsole from here using

In [ ]:
%qtconsole