CNK's Blog

Using IPython

Using IPython as your Python REPL

I had heard about IPython on my Twitter feed from people like Titus Brown but only in the context of IPython Notebooks for sharing data and calculations. I had been meaning to look into it because I figured at some point someone would want our group at work to do something about sharing how to do scientific analyses, etc. and that knowing IPython might come in handy. What I didn’t know is that you can use IPython - without the notebook component - as a replacement for the standard python REPL, kind of like how lots of people use pry instead of Ruby’s built in irb.

I wish I had looked into this sooner. IPython is more like the python REPL I needed when I was starting out in Python. I haven’t had a chance to use it a lot - for one thing I installed IPython in my virtual environment and my current environment doesn’t really have anything in it to play with. But already I am hopeful.

The main thing that makes running Python in a shell inside emacs so painful is that copying code and pasting into the emacs window makes the indenting go all weird. Can ipython fix that? I am not sure. But it does have a %paste macro. Does that help? Perhaps it helps for pasting with the paste buffer. But my usual emacs workflow of copying a chunk of code into my kill ring and then yanking it into the shell is still broken due to whitespace issues (unless of course the code is actually not indented, which rarely happens). Perhaps %run will help - at least to get some code into my REPL so I can play with it.

ipython has a nice readline history feature. One nice option is being able to get the output from the last 3 commands you ran with: _, __, and ___. I am also very impressed with being able to run system commands and assign the output to python variables, e.g. %cd /Users/me myfiles = %ls .bash*

Or something like:

    pattern = "imp"
    !grep -rF $pattern ipython/*

To get specific information on an object, you can use the magic commands %pdoc, %pdef, %psource and ```%pfile`` OMG! This is like pry’s cd into an object and look around. Instructions for using these magic commangs as part of some other python program are in the docs. This seems to me to be a lot like binding.pry to start a REPL somehwhere.

Since %automagic is turned ON by default, you can often just do ls or cd without the leading %. You can toggle the automagic by typing %automagic until you get what you want.

To see what things are included in automagic: %magic -brief

There is also a set of docs on how to use ipython as a systems shell: https://ipython.org/ipython-doc/dev/interactive/shell.html

Reloading files inside the REPL

The IPython.lib.deepreload module allows you to recursively reload a module: changes made to any of its dependencies will be reloaded without having to exit. To start using it, do:

    from IPython.lib.deepreload import reload as dreload

Misc

Automatic quoting

The automatic quoting sounded useful but when I played around with it, it was odd. All I really want is an equivalent of Ruby’s %w(foo bar baz) so I don’t have to type a boatload of “ and , to get ["foo", "bar", "baz"]. Unfortunately this is not that feature.

Spying on IPython

Or “How IPython keeps track of what you have running where”. When the ipython notebook started up, it created the nbserver-###.json file. When I started actually running code in an .ipynb file, then it needed a running kernel - so it spun one up and created the kernel=###.json file

    /Users/cnk/.ipython/profile_default/security:
      total used in directory 64 available 230555563
      drwx------   8 cnk  staff    272 May 14 18:26 .
      drwxr-xr-x  10 cnk  staff    340 May 14 18:26 ..
      -rw-rw-r--   1 cnk  staff    245 May 14 18:26 kernel-fc238266-ac92-423c-99d0-c6faeb911a15.json
      -rw-rw-r--   1 cnk  staff    187 May 14 18:26 nbserver-61240.json

This part of the docs has lots of useful information about how ipython processes communicate with the kernel - message passing, security (only bind to localhost OR use ssh tunnels to encrypt trafic and keep it private).