views:

724

answers:

5

For my debugging needs,pdb is pretty good. However, it would be MUCH cooler ( and helpful ) if I could go into ipython. Is this thing possible?

+4  A: 

Normally, when I use ipython, I turn automatic debugging on with the "pdb" command inside it.

I then run my script with the "run myscript.py" command in the directory where my script is located.

If I get an exception, ipython stops the program inside the debugger. Check out the help command for the magic ipython commands (%magic)

DoxaLogos
so there's no way of writing something like ipython.set_trace() ? :)
Geo
+3  A: 

From the IPython docs:

import IPython.ipapi
namespace = dict(
    kissa = 15,
    koira = 16)
IPython.ipapi.launch_new_instance(namespace)

will launch an IPython shell programmatically. Obviously the values in the namespace dict are just dummy values - it might make more sense to use locals() in practice.

Note that you have to hard-code this in; it's not going to work the way pdb does. If that's what you want, DoxaLogos' answer is probably more like what you're looking for.

David Zaslavsky
+15  A: 

There is an ipdb project which embeds iPython into the standard pdb, so you can just do:

import ipdb; ipdb.set_trace()

It's installable via the usual easy_install ipdb.

ipdb is pretty short, so instead of easy_installing you can also create a file ipdb.py somewhere on your Python path and paste the following into the file:

import sys
from IPython.Debugger import Pdb
from IPython.Shell import IPShell
from IPython import ipapi

shell = IPShell(argv=[''])

def set_trace():
    ip = ipapi.get()
    def_colors = ip.options.colors
    Pdb(def_colors).set_trace(sys._getframe().f_back)
Daniel Roseman
Awesome! This is so cool!
Geo
Works amazingly well with Django. Well, except the fact that I can't see the text I'm typing, but that's probably easily fixible (since ipdb's only six lines).
Xiong Chiamiov
+4  A: 

The equivalent of

import pdb; pdb.set_trace()

with IPython is something like:

from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()

It's a bit verbose, but good to know if you don't have ipdb installed. The make_session call is required once to set up the color scheme, etc, and set_trace calls can be placed anywhere you need to break.

ars