将PDB断点放在Python代码中的简单方法?

Joe*_*Joe 97 python pdb

只是一个方便的问题.我在Visual Studio和XCode等IDE中使用调试器有点被宠坏了.我发现必须键入import pdb; pdb.set_trace()设置断点有点笨拙(我宁愿不在文件顶部导入pdb,因为我可能会忘记并将其保留).

是否有一种更简单的方法在Python代码中设置断点,与您在IDE中看到的一样简单明了?

mde*_*ous 111

您可以pdb通过运行从命令行运行程序

python -m pdb your_script.py

它将在第1行中断,然后您将能够使用该break命令在代码中的任何位置添加断点,其语法为:

b(reak)[[filename:] lineno | 功能[,条件]]

它足够灵活,可以在任何地方添加断点.

  • 澄清这一点,如果我'pdb.set_trace()`并进入调试器,使用`l`命令(列表)并看到我想在第27行设置断点,然后输入:`b 27 `和调试器会在第27行设置一个断点(我发现文档有点难以理解,所以想补充一点澄清). (23认同)
  • 另外,如果你有一个对象`x`,并且想要在调用方法`f`时停止,你可以说`break xf`,然后是`c(ontinue)`.即使对象位于不可访问的文件中或者是动态创建的,例如通过unpickling,这也可以工作. (9认同)
  • 在堆栈跟踪之后进行调试时,您可以将完整路径复制到模块,并添加行号,例如`b /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers。 py:596` (2认同)

Apo*_*tus 55

您可以使用:

from pdb import set_trace as bp

code
code
bp()
code
code
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么有多余的别名,但是;-)。由于某种原因,我的 IDE/编辑器 (vscode) 今天上午变得很糟糕,并且一直在下划线。看到你的评论对我很有帮助。祝你有美好的一天! (2认同)

Dan*_*iel 34

在vim中,我为此设置了一个宏(在我的.vimrc文件中):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>
Run Code Online (Sandbox Code Playgroud)

所以我可以按\ b(当不在插入模式时)并在当前行之后添加断点,或者\ B(注意大写)并在当前行之前放置一个.

这似乎工作正常.大多数其他"简单"程序员编辑器(emacs,sublimetext等)应该有类似的简单方法来执行此操作.

编辑: 我实际上有:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>
Run Code Online (Sandbox Code Playgroud)

它只为python源文件打开它.您可以非常轻松地为javascript或您使用的任何其他语言添加类似的行.

  • 很好的解决方案,如果你在*.vimrc*文件中设置了'autoindent`,那么添加的行也会有正确的缩进. (2认同)

AXO*_*AXO 26

如果您不想在每次运行程序时手动设置断点(在Python 3.2+中),例如,假设您要在第3行直接创建断点并在那里停止执行:

python -m pdb -c "b 3" -c c your_script.py

以下信息可能有所帮助:

如果文件.pdbrc存在于用户的主目录或当前目录中,则会将其读入并执行,就好像它已在调试器提示符下键入一样.这对于别名特别有用.如果两个文件都存在,则首先读取主目录中的文件,并且可以由本地文件覆盖定义的别名.

版本3.2中已更改:.pdbrc现在可以包含继续调试的命令,例如continue或next.以前,这些命令没有任何效果.

版本3.2中的新增功能:pdb.py现在接受一个-c选项,该选项执行命令,就像在.pdbrc文件中一样,请参阅调试器命令.

  • 这很棒; 谢谢。请注意未来的谷歌用户:完整的语法是 `b(reak) [([filename:]lineno | function) [, condition]]`,因此您可以中断任何库代码,可以选择在断点上设置一个条件,将在以下行的上下文中进行评估:`python -m pdb -c "b /path/to/some_file.py:3, somevariable=26" -cc your_script.py` (3认同)

Bil*_*ill 18

我还没有尝试过,但他们只是在Python 3.7中实现了一个名为breakpoint()的新内置,这意味着你现在可以用一个语句插入一个断点:

breakpoint()
Run Code Online (Sandbox Code Playgroud)


pic*_*e 涅 10

这就是你如何在命令行中使用pdb而不在源代码中实现任何东西(文档和其他在线资源不能很好地向过去只使用过可视调试器的程序员解释这个):

通过在shell提示符下键入以下内容来启动pdb:

python -m pdb 'python_script'
Run Code Online (Sandbox Code Playgroud)

此命令初始化pdb,pdb调试器将在python_script的第一行中断并等待您的输入:

(Pdb)
Run Code Online (Sandbox Code Playgroud)

这是与调试器通信的接口.现在,您可以在此处指定命令.反对在可视调试器中使用按钮或键盘快捷键,在这里您将使用命令来获得相同的结果.

您可以通过命令"n"(下一步)转到代码中的下一行:

(Pdb) n
Run Code Online (Sandbox Code Playgroud)

执行next将显示行号,以及源中的特定代码:

> python_script(line number)method name
-> current line in the source code
Run Code Online (Sandbox Code Playgroud)

您可以通过在源代码中指定行号来设置断点.

(Pdb) b 50
Run Code Online (Sandbox Code Playgroud)

这里,调试器设置为在第50行中断.如果没有任何其他断点,则第50行的断点将是第一个断点,并且它可以由断点id引用,在这种情况下为1.如果添加更多断点,它们将按顺序获取标识符(即2,3等)

设置断点后,您将继续执行程序,直到pdb到达断点,如下所示:

(Pdb) c
Run Code Online (Sandbox Code Playgroud)

一旦到达断点,您可以使用前面描述的n命令转到下一行.如果要检查变量的值,可以按如下方式执行参数命令:

(Pdb) p variable_name
Run Code Online (Sandbox Code Playgroud)

如果您不再需要断点,可以通过使用clear命令传入断点的id来清除它:

(Pdb) clear 1
Run Code Online (Sandbox Code Playgroud)

最后,当您完成调试器后,您可以退出执行,就像退出python命令行解释器一样.

(Pdb) exit()
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助任何人开始使用pdb.以下是可以与调试器一起使用的命令列表:pdb所以问题和答案


Rut*_*ins 8

Python3.7有一种新的内置断点方式。打电话

breakpoint()
Run Code Online (Sandbox Code Playgroud)

更多在这里/sf/answers/3728418221/


Gle*_*min 4

您可以使用支持Python调试的IDE,或者您可以查看优秀的Winpdb工具。它适用于任何平台,并为您的 python 脚本提供图形调试工具。

http://winpdb.org/