Is it possible to use bpython as a full debugger?

3.5k views Asked by At

I would like to use the bpython interpreter for debugging. My question is similar to "Is it possible to go into ipython from code?", which asks about ipython.

If you use ipdb.set_trace() you get a full ipython session with all of its conveniences. However, bpdb.set_trace() doesn't give me a bpython session, it gives me the standard pdb debugger.

Is there any way of setting things up so that I can debug within a bpython session?

2

There are 2 answers

6
MrGomez On BEST ANSWER

Yes, using this wrapper, which you can also access by adding the statement import bpdb to your code. Add bpdb.set_trace() wherever you want to break, and from the pdb interpreter enter "B" to jump into a bpython session with everything from the stack frame:

# The MIT License
#
# Copyright (c) 2008 Bob Farrell
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.


import pdb
import bpython

class BPdb(pdb.Pdb):
    """ PDB with BPython support. """

    def __init__(self):
        pdb.Pdb.__init__(self)
        self.rcLines = []
        self.prompt = '(BPdb) '
        self.intro = 'Use "B" to enter bpython, Ctrl-d to exit it.'

    def postloop(self):
        # We only want to show the intro message once.
        self.intro = None
        pdb.Pdb.postloop(self)

    ### cmd.Cmd commands


    def do_Bpython(self, arg):
        bpython.embed(self.curframe.f_locals, ['-i'])


    def help_Bpython(self):
        print "B(python)"
        print
        print ("Invoke the bpython interpreter for this stack frame. To exit "
               "bpython and return to a standard pdb press Ctrl-d")


    ### shortcuts
    do_B = do_Bpython
    help_B = help_Bpython

Your question seems perfectly valid to me!

3
Amjith On

If you are looking for a cooler looking debugger that does completion and syntax highlighting you might want to take a look at pdb++. http://pypi.python.org/pypi/pdbpp/

enter image description here

It's a drop in replacement for pdb. So you can continue to use

 import pdb; pdb.set_trace()

and it'll drop you into the pdb++ prompt.