Is it possible to use bpython as a full debugger?
Asked Answered
S

2

19

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?

Soliloquize answered 27/3, 2012 at 15:33 Comment(5)
Would it cost you a lot to try it?Sherrod
@Sherrod I should clarify that bpdb.set_trace() gives me the standard pdb debuggerSoliloquize
So, is that a problem? How does a question arise from that?Sherrod
Yes: If you use ipdb.set_trace() you get a full ipython debugger session with all of its conveniences. In my opinion bpython is much nicer to work with, however bpdb.set_trace() doesn't give me a bpython sessionSoliloquize
@MRE Yep, it's doable. See my answer.Vengeance
V
24

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!

Vengeance answered 31/3, 2012 at 0:29 Comment(6)
Hi, thanks for pointing me to this, but this is just a wrapper around pdb. It's included in the bpdb module. When I use it, it just gives me the pdb debugger (i.e. no highlighting, completion, docs, etc). Unless it does something different on your machine?Soliloquize
@MrE This seems to be the extent provided for bpython, but Amjith is absolutely right. For extending pdb to be pleasant as a debugger, pdb++ is the way to go. :)Vengeance
on further inspection, aka reading the code above, from the pdb debugger session if you type "B" you jump into a bpython session. So I've marked this as correct.Soliloquize
@MrE I'm glad both of us here were able to assist you! I do apologize on behalf of my peers for the initial downvotes and terse responses you received. I'm just glad we were able to step in and help. :)Vengeance
No need to apologise. Hope you don't mind if I added the rest of the info to your answer. Feel free to reword if you like.Soliloquize
@MrE No worries at all. Thanks for taking the time to explain your problem and help us help you (help us all).Vengeance
W
12

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.

Worthy answered 2/4, 2012 at 2:12 Comment(3)
Hey, this is really nice. Not quite as slick as bpython (in interactive mode) but still a big and painless upgrade.Soliloquize
I agree, the completion isn't quite as awesome as bpython. I like the sticky feature, where the code is shown above and highlights the current line that is being executed.Worthy
Having pdbpp already installed with python3.7+, you can just call breakpoint builtin and pdbpp debugger will take placeMyalgia

© 2022 - 2024 — McMap. All rights reserved.