12

我知道有一千篇关于 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 单步执行)一样。

4

4 回答 4

11

那个 pdb 调试看起来并不有趣。我明白你为什么不喜欢它。

幸运的是,那里一些可视化 Python 调试器。我最常使用的两个是商业产品,但它们都物有所值。它们是Komodo IDEIntelliJ IDEA。这些是多语言 IDE,除了 Python 之外还支持许多其他语言。还有一个名为PyCharm的仅 Python 版本的 IDEA 。

还有一个很棒的免费选项Winpdb。它易于使用:安装并打开它后,使用 File/Launch 并输入文件的完整路径.py,然后您就可以开始调试了。

这些产品都是多平台的,但如果你在 Windows 上,另一个免费选项是 Microsoft 的Python Tools for Visual Studio。您可以将其安装到商业 Visual Studio 2015 或 Visual Studio 2015 的免费社区版中。

为了给你一个想法,这里是来自 Winpdb、Komodo 和 IDEA 的代码截图。我进入了__init__每个功能:

在此处输入图像描述  

在此处输入图像描述  

在此处输入图像描述

如果您不喜欢我使用的代码字体,请不要担心;这只是我的个人设置。当然,在正常使用中,屏幕不会那么狭窄;我把它做得很小以适合屏幕截图。

我强烈推荐这些可视化调试器中的任何一个 - 能够通过单次击键单步执行代码并观察变量随您的变化而变化,这真是太好了。

于 2013-05-10T03:27:05.100 回答
3

您当前的 pdb.set_trace() 调用是在定义类时发生的,而不是在调用init之后发生的。如果您在init中移动 pdb.set_trace() 调用

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)
于 2013-05-10T00:43:16.127 回答
0

此处描述的用于 Jupyter Notebooks 的 Python 可视化调试器可能很有趣。
(免责声明:我是首席开发人员)

于 2018-03-12T13:22:10.027 回答
0

我一直在使用(自 2011 年 1 月以来)WingWare 的 WingIDE(我有 4.x Pro 版)。我只将它用于调试,它对我很有帮助 - 诚然我不是高级用户。我设置断点,逐行步进等。

于 2017-02-02T03:13:14.337 回答