能否将bpython用作完整的调试器?

19
我想使用bpython解释器进行调试。 我的问题类似于“是否可以从代码进入ipython?”,该问题询问ipython。
如果您使用ipdb.set_trace(),您将获得带有所有方便功能的完整ipython会话。但是,bpdb.set_trace()没有给我一个bpython会话,而是给了我标准的pdb调试器。
有没有任何设置方法,让我能够在bpython会话中进行调试?

你试一下会花费很多吗? - Marcin
@Marcin 我应该澄清一下,bpdb.set_trace() 给我标准的 pdb 调试器。 - YXD
那么,这是个问题吗?为什么会从这里产生一个问题呢? - Marcin
5
如果你使用 ipdb.set_trace(),你将获得完整的 ipython 调试器会话并享有所有便利。在我看来,使用 bpython 更加舒适,但是 bpdb.set_trace() 并不能提供 bpython 会话。 - YXD
1
@MRE 是的,这是可行的。请查看我的回答。 - MrGomez
2个回答

24

是的,可以使用这个包装器。你也可以通过在代码中添加语句import bpdb来访问它。在任何想要断点的地方加上bpdb.set_trace(),然后从解释器中输入“ B”进入一个会话,其中包含堆栈帧中的所有内容:

# 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

你的问题在我看来是完全有效的!


1
嗨,感谢您指引我到这里,但这只是pdb的包装器。它包含在bpdb模块中。当我使用它时,它只会给我pdb调试器(即没有高亮,完成,文档等)。除非在您的机器上有所不同? - YXD
@MrE 这似乎是为 bpython 提供的范围,但Amjith是绝对正确的。要将 pdb 扩展为一个愉悦的调试器,pdb++ 是最好的选择。 :) - MrGomez
进一步检查,即阅读上面的代码,在pdb调试器会话中,如果您键入“B”,则会跳转到bpython会话。因此,我已将其标记为正确。 - YXD
@MrE,我很高兴我们都能够帮助你!我代表我的同行为你们最初的负评和简短的回复道歉。我很高兴我们能够介入并提供帮助。 :) - MrGomez
不需要道歉。希望你不介意我在你的答案中添加了其他信息。如果你愿意,可以重新措辞。 - YXD
@MrE 没问题。感谢您抽出时间解释您的问题并帮助我们帮助您(帮助我们所有人)。 - MrGomez

12
如果你正在寻找一个更酷炫的调试器,它可以自动完成和语法高亮,那么你可能想看看pdb++。它是pdb的替代品,因此您可以继续使用...http://pypi.python.org/pypi/pdbpp/

enter image description here

 import pdb; pdb.set_trace()

然后它会把你带到pdb++提示符中。


2
嘿,这真的很不错。虽然在交互模式下不如bpython那么流畅,但仍然是一个巨大且无痛的升级。 - YXD
1
我同意,这个完成度不如bpython那么棒。我喜欢它的粘性功能,可以显示代码并突出当前正在执行的行。 - Amjith
1
如果您已经在Python3.7+中安装了pdbpp,您只需调用breakpoint内置函数,pdbpp调试器就会启动。 - Vladimir Yahello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接