逐步调试所选Python代码

时间:2018-01-10 07:28:54

标签: python-3.x debugging ide spyder

本质:

使用Spyder,可以通过突出显示并点击 F9 来运行部分代码。这也适用于For循环,但问题(至少对我来说)是,似乎不可能一步一步地运行所选部分 。我发现这有点奇怪,因为它可以在其他情况下逐步运行For循环(并检查每一步的变量状态)。

请允许我解释一下:

下面的代码段是使用For循环对两个变量names = ['A', 'B', 'C']values = [11,12,13]的操作。为了正确描述我无法对此设置进行操作,我认为有必要解释我能够的内容为什么我认为如果事实证明我想做的事实际上是不可能的,那么为什么我觉得有点奇怪。

我经常发现自己使用不同的例程来处理很多变量。我面临的问题是,为了调试这些例程,我经常需要重新运行部分代码来重新定义我的所有变量,然后才真正能够查找其他部分的错误。码。这就是为什么能够在Spyders Variable explorer中检查预先存在的变量上逐步调试For循环的原因。我主要在Spyder中乱用Python,但请建议其他可能的IDE。

以下是一个例子:

def foo():
    names = ['A', 'B', 'C']
    values = [11,12,13]
    i = 0
    for n in names:
        variable = str(n)  + ' = ' + str(values[i])
        print(variable)
        i += 1      
foo()

以下是我的选择(如果问题看起来很清楚,您可以轻松跳转到最后一部分选项5 ):

选项1 - 使用运行代码运行文件(F5)

这不出所料地在IPython控制台中输出以下内容:

A = 11
B = 12
C = 13

其余环境如下所示。请注意,它不会在变量资源管理器中将任何变量留在内存中和/或进行检查。这对记忆管理有好处,但对于那些不关心这些事情的小规模想成为程序员来说是不好的。

enter image description here

选项2 - 忘记该功能,只需运行文件

注释掉def foo()foo()并单击运行文件(F5)(同时修复缩进)会向IPython控制台输出相同的内容并将变量放在后面可变资源管理器进一步检查。

已修改的代码:

#def foo():
names = ['A', 'B', 'C']
values = [11,12,13]

i = 0
for n in names:
    variable = str(n)  + ' = ' + str(values[i])
    print(variable)
    i += 1      
#foo()

环境:

enter image description here

请注意,变量资源管理器会在执行代码后显示每个变量的状态。

选项3 - 与选项2相同的代码现在使用调试文件(Cltr + F5)运行当前行(Ctrl + F10)

单击调试文件(Cltr + F5)将允许我从例程的开头开始,并使用运行当前行(Ctrl + f10)逐行逐步执行。包括For循环中的行。在每个步骤中,我都可以在变量资源管理器中更改变量的状态。

单步执行For循环后的环境:

enter image description here

对于像我这样的非专业程序员来说,这看起来是编写和调试代码的最简单,最基本的方式。但是,很难避免将代码包装到函数中以获得更高的可重用性。所以,再次回到foo()

选项4 - 使用调试文件(Cltr + F5)调试函数继续执行直到下一个断点(Ctrl + F12) Step Into当前行的功能或方法(Ctrl + F11)运行当前行(Ctrl + F10)

使用调试文件(Cltr + F5)启动调试并突出显示第2行。要进行,我可以使用继续执行直到下一个断点(Ctrl + F12)停止执行第11行。在这里我可以选择运行当前行(Ctrl + f10)调用函数而不再有模糊,或者我可以 Step Into Function或当前行的方法(Ctrl + F11)带我到我快乐的地方。现在我可以运行当前行(Ctrl + F10)来定义变量,甚至可以在变量浏览器中逐步检查For循环中的变量。在定义函数中的变量并逐步执行For循环之后,这里是环境:

enter image description here

那又是什么问题?

选项5 - 使用现有变量调试for循环

在Spyder中,只需突出显示代码并使用运行选择或当前行(F9)即可运行部分代码,甚至无需定义函数。因此,从头开始,我可以通过选择它们并单击 F9 来定义我的变量。现在,他们可以在Variable explorer中获得进一步检查:

enter image description here

您可以对其余代码执行相同的操作。 For Loop完整地运行 ,并且变量在变量资源管理器中可用。

enter image description here

现在,最后,我们到达了主要问题。是否有可能逐步完成突出显示的For循环而不是同时完成整个事情,如选项1 ? (并且无需执行该功能,在断点处停止并继续使用选项4 中所述的 F10 ?)

理想情况下,它就像突出显示代码一样简单,并执行类似逐步调试所选代码(Ctrl' ??)之类的内容。

我希望这对你们中的一些人有意义。如果这种方法从头到尾完全错误,请告诉我!

谢谢!

编辑:在使用 F9 运行所选部件之前添加断点无效:

enter image description here

编辑2 - 系统信息:

  • Windows 7
  • Python 3.6.0 Anaconda custom(64位)
  • Spyder 3.2.5

2 个答案:

答案 0 :(得分:4)

Spyder维护者在这里)有很多人都知道在Python代码中的任何地方引入断点:import pdb; pdb.set_trace()

在您的情况下,您需要用

替换您的代码
def foo():
    names = ['A', 'B', 'C']
    values = [11,12,13]
    i = 0
    import pdb; pdb.set_trace()
    for n in names:
        variable = str(n)  + ' = ' + str(values[i])
        print(variable)
        i += 1

foo()

然后使用Run file / F5 运行文件,或者使用 Ctrl + Enter 作为单元格运行文件。通过这个简单的更改,您将在pdb.set_trace()行放置一个调试器会话,并在其下方输入for周期,逐行迭代。

注意:由于Python 3.7 ,这甚至更简单,因为它添加了一个名为breakpoint的新内置函数来替换pdb.set_trace(),但是完全相同的效果。

答案 1 :(得分:1)

Visual Studio Community Edition

(某些加载项与python不相关):

免责声明: 我使用它是因为我熟悉它(C#)并且可以免费使用 - 不是因为它特别是pythonic。

编码布局可配置):

  • :代码

  • 左下角:输出(通常我将其折叠到仅底部的标签以获得更多编码屏幕。可能缩小尺寸并切换到标签Error List列表您的代码中的错误(doh)。您的代码非常完美,因此您没有看到任何 sqigglies 指出代码中的错误。

  • 正确:解决方案资源管理器 - 基本上是这个特殊python解决方案中的文件。

  • 右下角:所选文件的属性

所有窗口都可以移除,调整大小,不固定以成为“自由浮动窗口”或折叠成窗口左/右侧的垂直标签,以获得更多对您来说重要的屏幕区域)

Code not running

看到线条边上的红点?在运行代码之前放置它们。它们标记为break points,代码执行在命中​​时自动停止运行(基本使用),或者您可以将它们配置为

  • 停止运行但打印出变量的跟踪信息
  • 仅在f.e.有条件地停止变量值变为5(loop index之后你的程序崩溃了所有的时间或其他“条件”)
  • 他们也只能停止on 4th time hit和其他一些事情:

break point config

调试代码:

F5启动代码运行会更改布局(参见上文,您可以更改它并在下次运行时保持更改):

debugging code

当你停止时,你可以将鼠标悬停在已经使用的变量上并检查它们,你可以将这些信息固定到一边 - 如果更改了引脚的文本将变为红色以显示它。

您还可以将内容放入“观察窗口”或使用“快速监视”进行检查 - 窗口下半部分的屏幕截图。从中断开始,您可以继续F5直到下一个断点,或者使用F10F11

  • F10“逐行”逐句执行“语句”
  • F11“进入”语句 - 即如果您的语句是函数调用,它将执行F10函数并使用F11
  • 执行函数

如果在函数内部,您可以使用SHIFT+F11完成该功能并再次退出并从那里开始。

我曾两次使用F5F10,而且我目前处于箭头所示的行。您也可以将箭头向上拖动一些行以重新执行代码,但这可能有副作用 - 我很好地使用它,大多数时候我只是重新启动程序Ctrl+Shift+F5或停止调试Shift+F5

程序的print输出显示在从屏幕截图中裁剪的普通控制台窗口中。

AddOn1:您也可以简单地执行所有代码,不使用CTRL+F5进行调试,并且IDE具有python的“一些”其他功能。

AddOn2:VS自然带来了许多在IDE中有用的其他功能,比如集成到git等等 - 如果你使用它们可以通过插件在IDE中“可用” - 尽管有些事情做得更好git.bash。