Daniel Kluev
Daniel Kluev

Reputation: 11315

What is best way for interactive debug in python?

I want to utilize introspection capability of python for debugging/development, but cannot find appropriate tool for this.

I need to enter into shell (IPython for example) at specific position or at specific event (like exception), with locals and globals of shell being set to the frame's ones.

My own quick hack to illustrate it:

import inspect
from IPython.Shell import IPShellEmbed
def run_debug():
    stack = inspect.stack()
    frame = stack[1][0]
    loc = frame.f_locals
    glob = frame.f_globals
    shell = IPShellEmbed()
    shell(local_ns=loc, global_ns=glob)

With according run_debug() call from 'breakpoint' or try/except. But, obviously, this needs alot of polishing, esp to work with threaded apps properly.

winpdb has breakpoints with console, but I found no way to quickly run proper python shell from it, and eval()/exec() are not very handy for long debug.

Upvotes: 8

Views: 2299

Answers (3)

Joe Kington
Joe Kington

Reputation: 284562

Similar to what you're already doing, there's ipdb. Effectively, it's pdb with ipython's shell (i.e. tab completion, all the various magic functions, etc).

It's actually doing exactly what the little code snipped you posted in your question does, but wraps it into a simple "ipdb.set_trace()" call.

Upvotes: 3

macedoine
macedoine

Reputation: 347

If you run your code from ipython and hit an exception, you can call %debug afterwards to drop into a pdb at the exception. This should give you what you want. Or if you run ipython -pdb, you will automatically be dropped into pdb when an uncaught exception occurs.

Upvotes: 0

Wayne Werner
Wayne Werner

Reputation: 51787

For personal/education purposes you can use WingIDE - they have some pretty solid debugging capabilities.

Of course if you're just worried about changing values you can always just use raw_input() - but that may not be advanced enough for your needs.

Upvotes: 2

Related Questions