Python可视化调试器

13

我知道有很多Python的调试文章,但我找不到我需要的……一个可视化的调试器。例如:

one@localhost ~ $ cat duh.py    
import pdb
class Coordinate(object):
     pdb.set_trace()
     def __init__(self, x, y):
         self.x = x
         self.y = y
     def __repr__(self):
         return "Coord: " + str(self.__dict__)
def add(a, b):
     return Coordinate(a.x + b.x, a.y + b.y)
def sub(a, b):
    return Coordinate(a.x - b.x, a.y - b.y)

one = Coordinate(100,200)
two = Coordinate(300,200)

add(one, two)

我希望能看到实际使用的值。不要显示 def __init__(self, x, y):,而是显示 def __init__(self, 100, 200):

> /home/one/duh.py(14)<module>()
-> one = Coordinate(100,200)
(Pdb) s
--Call--
> /home/one/duh.py(4)__init__()
-> def __init__(self, x, y):
(Pdb) s
> /home/one/duh.py(5)__init__()
-> self.x = x
(Pdb) s
> /home/one/duh.py(6)__init__()
-> self.y = y
(Pdb) s
--Return--
> /home/one/duh.py(6)__init__()->None
-> self.y = y

我完全不习惯看不到解释器内部发生的事情,真的想像其他脚本语言调试器(如JavaScript逐步执行)一样看到内部发生的情况。


1
我相信这就是LightTable旨在实现的目标(在IDE中实时运行)-但还不确定它的工作效果如何。 - Gareth Latty
1
提醒一下,我在我的回答中添加了关于Winpdb的一些信息。(我不确定当我编辑回答时是否会通知您。)Winpdb是Python的一个出色的免费可视化调试器。不确定为什么我在第一次回复时忘记了它;可能是因为我一直在Komodo和IDEA中花费所有的时间。 :-) - Michael Geary
1
http://thonny.org/ - 适用于初学者,并具有高度可视化的调试器内置支持。 - lifebalance
4个回答

13

那个pdb调试看起来不好玩。我能理解你为什么不喜欢它。

幸运的是,有一些可视化Python调试器可供选择。我经常使用的两个都是商业产品,但它们的价格都非常值得。它们是Komodo IDEIntelliJ IDEA。这些是支持许多其他语言以及Python的多语言IDE。还有一个名为PyCharm的Python专用版本的IDE。

还有一个很棒的免费选项,Winpdb存档链接 / SourceForge.net / Google Code Archive)或者 官方 Winpdb 的分支winpdb-reborn · PyPI / GitHub)。它很容易使用:安装并打开后,使用文件/启动,输入您的.py文件的完整路径,然后就可以开始调试了。

这些产品都是多平台的,但如果你使用Windows系统,另一个免费选项是微软的Python Tools for Visual Studio存档链接 / 2023年新链接)。你可以将其安装到商业版Visual Studio 2015或免费的Visual Studio 2015社区版中。

为了让你有个想法,这里有Winpdb、Komodo和IDEA中代码的截图。我在每个函数的__init__中进行了步进:

enter image description here  

enter image description here  

enter image description here

如果你不喜欢我使用的代码字体,不用担心;那只是我的个人设置。当然,在正常使用中屏幕并不会这么拥挤;我把它缩小以适应截图。

我强烈推荐任何一个可视化调试器——能够通过单个按键逐步执行代码并观察变量的变化非常棒。


4

你当前的pdb.set_trace()调用发生在类被定义时,而不是在init被调用后。如果你将pdb.set_trace()调用移动到init函数内部。

import pdb
class Coordinate(object):
     def __init__(self, x, y):
          pdb.set_trace()

          self.x = x
          self.y = y
     def __repr__(self):
          return "Coord: " + str(self.__dict__)
def add(a, b):
     return Coordinate(a.x + b.x, a.y + b.y)
def sub(a, b):
     return Coordinate(a.x - b.x, a.y - b.y)

one = Coordinate(100,200)
two = Coordinate(300,200)

add(one, two)

然后在pdb中,您只需键入print x, y即可获取值:

C:\Users\randlet>python duh.py
> c:\users\randlet\duh.py(6)__init__()
-> self.x = x
(Pdb) print x, y
100 200
(Pdb) c
> c:\users\randlet\duh.py(6)__init__()
-> self.x = x
(Pdb) print x, y
300 200
(Pdb) n
> c:\users\randlet\duh.py(7)__init__()
-> self.y = y
(Pdb) n
--Return--
> c:\users\randlet\duh.py(7)__init__()->None
-> self.y = y
(Pdb) n
> c:\users\randlet\duh.py(18)<module>()
-> add(one, two)
(Pdb) print one, two
Coord: {'y': 200, 'x': 100} Coord: {'y': 200, 'x': 300}
(Pdb) s
--Call--
> c:\users\randlet\duh.py(10)add()
-> def add(a, b):
(Pdb) print a, b
Coord: {'y': 200, 'x': 100} Coord: {'y': 200, 'x': 300}
(Pdb)

1

这里有一个针对Jupyter Notebooks的Python可视化调试器(点击此处),可能会很有用。

(免责声明:我是主要开发人员)

0

我一直在使用WingWare的WingIDE(自2011年1月以来),我有4.x专业版。我只用它进行调试,它为我服务得很好 - 尽管我不是高级用户。我设置断点,逐行步进等。


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