在 Spyder 中从命令行调试 Python 函数(或 class)
Debugging Python function (or class) from the command line in Spyder
我是一个新 Python 用户,我一直在用 Matlab 编程,所以我决定使用 Spyder IDE(它看起来很像 Matlab IDE)。
现在我想调试(逐行执行以便理解)一些 python 代码,这些代码被编写为 class 并带有几个内置函数。因此,我在 class 的 __init__
函数处插入了一个断点,但是,当我开始调试时它没有转到指定的断点(因为我必须调用 class初始化,而不仅仅是代码执行)。
是否可以从命令行启动 class 调试?
在 Matlab 中,我只是从命令行调用一个函数,它会在指定的断点处停止。在这里我必须启动一个调试器,而不是调用一个函数。如果我简单地调用以下内容:
import energy_model
x = energy_model.EnergyModel()
它只会执行并忽略我的断点。
希望我的问题很清楚。
谢谢,
米哈伊尔
首先,确保您点击的是 spyder 中的调试按钮,而不是 运行 按钮。 运行 按钮不会触发断点,因此您需要点击调试,然后继续获取代码中的第一个断点。
如果失败,一种选择是使用 python 调试器 (pdb)。这完全来自command-line,即运行宁调试命令和接收调试信息也将通过command-line。
class EnergyModel:
__init__(self):
# set breakpoint
import pdb; pdb.set_trace()
...
command-line 中的 运行 将在 __init__
方法中暂停执行。
此处列出了命中断点时可以发出 pdb 的一些命令:
https://nblock.org/2011/11/15/pdb-cheatsheet/
更新 #1
spyder 可以触发断点的函数示例
def test(a_string):
print(a_string) # breakpoint set here will be hit
test("hello world")
如果您想在 Spyder 中调试代码,可能最好 运行 它所在的模块,方法是单击蓝色 Play/Pause 按钮进行调试。
那么我们如何调试一个全 classes 或函数,没有脚本的模块?当这个模块是我们点击播放的那个模块时,我们添加的脚本只有 运行s,将它全部放在 if __name__=="__main__":
下。 (See here for more info on how that works.)
然后我们可以在我们想要调试的函数或class中放置一个断点,从if __name__==__"__main__":
中调用它,运行带有蓝色[=19=的模块] 按钮,然后从 IPython 控制台访问正在发生的事情。
我是一个新 Python 用户,我一直在用 Matlab 编程,所以我决定使用 Spyder IDE(它看起来很像 Matlab IDE)。
现在我想调试(逐行执行以便理解)一些 python 代码,这些代码被编写为 class 并带有几个内置函数。因此,我在 class 的 __init__
函数处插入了一个断点,但是,当我开始调试时它没有转到指定的断点(因为我必须调用 class初始化,而不仅仅是代码执行)。
是否可以从命令行启动 class 调试? 在 Matlab 中,我只是从命令行调用一个函数,它会在指定的断点处停止。在这里我必须启动一个调试器,而不是调用一个函数。如果我简单地调用以下内容:
import energy_model
x = energy_model.EnergyModel()
它只会执行并忽略我的断点。
希望我的问题很清楚。 谢谢, 米哈伊尔
首先,确保您点击的是 spyder 中的调试按钮,而不是 运行 按钮。 运行 按钮不会触发断点,因此您需要点击调试,然后继续获取代码中的第一个断点。
如果失败,一种选择是使用 python 调试器 (pdb)。这完全来自command-line,即运行宁调试命令和接收调试信息也将通过command-line。
class EnergyModel:
__init__(self):
# set breakpoint
import pdb; pdb.set_trace()
...
command-line 中的 运行 将在 __init__
方法中暂停执行。
此处列出了命中断点时可以发出 pdb 的一些命令: https://nblock.org/2011/11/15/pdb-cheatsheet/
更新 #1
spyder 可以触发断点的函数示例
def test(a_string):
print(a_string) # breakpoint set here will be hit
test("hello world")
如果您想在 Spyder 中调试代码,可能最好 运行 它所在的模块,方法是单击蓝色 Play/Pause 按钮进行调试。
那么我们如何调试一个全 classes 或函数,没有脚本的模块?当这个模块是我们点击播放的那个模块时,我们添加的脚本只有 运行s,将它全部放在 if __name__=="__main__":
下。 (See here for more info on how that works.)
然后我们可以在我们想要调试的函数或class中放置一个断点,从if __name__==__"__main__":
中调用它,运行带有蓝色[=19=的模块] 按钮,然后从 IPython 控制台访问正在发生的事情。