在Java/ c#中,您可以很容易地逐级检查代码以跟踪可能出错的地方,而IDE使这个过程对用户非常友好。

你能以类似的方式跟踪python代码吗?


当前回答

ipdb (IPython调试器)

ipdb在pdb中添加了IPython功能,提供了以下巨大的改进:

选项卡完成 显示更多的上下文行 语法高亮显示

就像pdg一样,如果与GDB相比,ipdb还远远不够完美和完全初级,但它已经比pdb有了巨大的改进。

用法类似于pdb,只需安装它:

python3 -m pip install --user ipdb

然后添加到你想要进行步进调试的行:

__import__('ipdb').set_trace(context=21)

你可能想从你的编辑器中添加一个快捷方式,例如,对于Vim snipmate我有:

snippet ipd
    __import__('ipdb').set_trace(context=21)

所以我可以输入ipd<tab>,它扩展到断点。然后使用dd很容易删除它,因为所有内容都包含在一行中。

context=21增加上下文行数,如调试时如何使ipdb显示更多的上下文行所述?

或者,你也可以从一开始调试程序:

ipdb3 main.py

但你通常不想这样做,因为:

在Python读取这些行时,你必须遍历所有函数和类的定义 我不知道如何在不入侵ipdb的情况下设置上下文大小。补丁允许:https://github.com/gotcha/ipdb/pull/155

或者,就像在raw pdb 3.2+中一样,你可以从命令行设置一些断点:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

尽管-c c因为某些原因被破坏了:https://github.com/gotcha/ipdb/issues/156

如何调试从命令行使用python -m运行的python模块?因为Python 3.7可以用:

python -m pdb -m my_module

与GDB相比,pdb和ipdb的特性严重缺失:

持久化命令历史跨会话:保存命令历史在pdb中

Ipdb具体烦恼:

多线程不能很好地工作,如果你不hack一些设置… ipdb,多线程和自动重载程序导致ProgrammingError https://github.com/gotcha/ipdb/issues/51

在Ubuntu 16.04中测试,ipdb==0.11, Python 3.5.2。

其他回答

在python中有一个叫做'pdb'的模块。在python脚本的顶部

import pdb
pdb.set_trace()

然后进入调试模式。您可以使用's'步进,'n'跟随下一行,类似于使用'gdb'调试器。

通过python代码进行编程步进和跟踪也是可能的(而且很简单!)查看sys.settrace()文档了解更多细节。这里也有一个教程让你开始。

从Python 3.7开始,你可以使用breakpoint()内置函数进入调试器:

foo()
breakpoint()  # drop into the debugger at this point
bar()

默认情况下,breakpoint()将导入pdb并调用pdb.set_trace()。但是,你可以通过sys.breakpointhook()和使用环境变量PYTHONBREAKPOINT来控制调试行为。

有关更多信息,请参阅PEP 553。

VSCode

如果你想使用IDE,这是PyCharm的一个很好的替代方案。

安装VSCode 安装Python扩展,如果还没有安装的话 用Python代码创建一个文件mymodule.py 若要设置断点,请将鼠标悬停在行号上并单击红点,或按F9 按F5开始调试并选择Python文件

它将在断点处停止,你可以做你通常的调试工作,比如检查变量的值,可以在变量选项卡(通常在左边)或单击调试控制台(通常在终端旁边的底部):

这个截图显示了VSCodium。

更多的信息

在VS Code中的Python调试 在VS Code中开始学习Python 在Visual Studio代码中调试

你可以选择带PTVS的VisualStudio: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx