Each Answer to this Q is separated by one/two green lines.
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?
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
pip 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)
In IPython 0.11, you can embed IPython directly in your code like this
Your program might look like this
In : cat > tmpf.py a = 1 from IPython import embed embed() # drop into an IPython session. # Any variables you define or modify here # will not affect program execution c = 2 ^D
This is what happens when you run it (I arbitrarily chose to run it inside an existing ipython session. Nesting ipython sessions like this in my experience can cause it to crash).
In : In : run tmpf.py Python 2.7.2 (default, Aug 25 2011, 00:06:33) Type "copyright", "credits" or "license" for more information. IPython 0.11 -- 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 : who a embed In : a Out: 1 In : Do you really want to exit ([y]/n)? y In : who a c embed
If you’re using a more modern version of IPython (> 0.10.2) you can use something like
from IPython.core.debugger import Pdb Pdb().set_trace()
But it’s probably better to just use ipdb
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.
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)
I like to simply paste this one-liner in my scripts where I want to set a breakpoint:
Newer version might use:
Looks like modules have been shuffled around a bit recently. On IPython 0.13.1 the following works for me
from IPython.core.debugger import Tracer; breakpoint = Tracer() breakpoint() # <= wherever you want to set the breakpoint
Though alas, it’s all pretty worthless in qtconsole.
Newer versions of IPython provide an easy mechanism for embedding and nesting IPython sessions into any Python programs. You can follow the following recipe to embed IPython sessions:
try: get_ipython except NameError: banner=exit_msg='' else: banner="*** Nested interpreter ***" exit_msg = '*** Back in main IPython ***' # First import the embed function from IPython.frontend.terminal.embed import InteractiveShellEmbed # Now create the IPython shell instance. Put ipshell() anywhere in your code # where you want it to open. ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)
ipshell() whenever you want to drop into an IPython shell. This will allow you to embed (and even nest) IPython interpreters in your code.
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.
The fast-and-easy way:
from IPython.Debugger import Tracer debug = Tracer()
Then just write
wherever you want to start debugging your program.
I had to google this a couple if times the last few days so adding an answer… sometimes it’s nice to be able run a script normally and only drop into ipython/ipdb on errors, without having to put
ipdb.set_trace() breakpoints into the code
ipython --pdb -c "%run path/to/my/script.py --with-args here"
pip install ipython and
pip install ipdb of course)
This is pretty simple:
ipython some_script.py --pdb
It needs iPython installing, usually this works:
pip install ipython
I use ipython3 instead of ipython, so I know it’s a recent version of Python.
This is simple to remember because you just use iPython instead of python, and add –pdb to the end.
To get IPython’s REPL using terminal colors, I had to do this:
from IPython import start_ipython start_ipython()