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

只是个方便的问题。我已经被像 VisualStudio 和 XCode 这样的 IDE 中的调试器给宠坏了。我发现键入 import pdb; pdb.set_trace()来设置断点有点笨拙(我宁愿不在文件的顶部导入 pdb,因为我可能会忘记并将它保留在文件中)。

在 Python 代码中设置断点是否有一种更简单的方法,就像您在 IDE 中看到的那样简单和不引人注目?

121618 次浏览

您可以使用支持 python 调试的 IDE,也可以查看出色的 Winpdb 工具。它可以在任何平台上工作,并为 Python 脚本提供图形化调试工具。

Http://winpdb.org/

你可使用:

  • 侧翼
  • 用 pydev 插件遮挡
  • 金字塔

上述所有方法都支持在 IDE 内部进行 python 调试。

可以通过运行以下命令从命令行将程序运行到 pdb

Python-m pdb your _ script. py

它将在第一行中断,然后您可以使用 break命令在代码中的任何位置添加断点,其语法如下:

B (reak)[[文件名: ] lineno | function [ ,條件]]

它非常灵活,允许您在任何地方添加断点。

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

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

所以我可以按 b (当不在插入模式时) ,它在当前行后面加上一个断点,或者 B (注意大写) ,它在当前行前面加上一个断点。

看起来还不错。大多数其他“简单”程序员编辑器(emacs、 sublimettext 等)应该有类似的简单方法来实现这一点。

编辑: 其实我有:

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>

它只对 Python 源文件开启。您可以很容易地为 javascript 或其他您使用的语言添加类似的代码行。

2019年更新(Python 3.7 +) * *

Python 3.7 + 现在有了内置的 breakpoint(),它可以在 vim 中替换以前的 import pdb; pdb.set_trace()。还是老样子。

2021年最新情况

所以这些天我做了很多 django,我也在使用 ipdb 调试器,使用了一些 javascript 和 HTML 模板,所以现在有:

function InsertDebug()
if &filetype == "python"
execute "normal! oimport ipdb;ipdb.set_trace()\<esc>"
elseif &filetype == "javascript"
execute "normal! odebugger;\<esc>"
elseif &filetype == "html" || &filetype == "htmldjango"
execute "normal! o{% load debugger_tags %}\{\{ page\|ipdb }}\<esc>4bcw"
else
echoerr "Unknown filetype - cannot insert breakpoint"
endif
endfunction
nmap <leader>b <esc>:call InsertDebug()<CR>

所以我要么得到 ipdb断点,要么得到这些语言中的其他语言断点。那么这也很容易扩展到其他语言。我认为可以使用更好的自动命令来实现这一点——但是我不能让它像这样可靠地工作。

在脚本上运行调试器的最简单方法是

pdb your_script.py

在 Linux 命令行上运行 pdb 会给出

usage: pdb.py scriptfile [arg] ...

你可使用:

from pdb import set_trace as bp


code
code
bp()
code
code

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

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

下列资料可能有帮助:

如果一个文件。Pdbrc 存在于用户的主目录或工作目录中,它被读入并执行,就好像它是在调试器提示符下键入的一样。这对别名特别有用。如果两个文件都存在,则首先读取 home 目录中的文件,并且定义的别名可以被本地文件覆盖。

更改版本3.2: 。Pdbrc 现在可以包含继续调试的命令,如继续或下一步。以前,这些命令没有效果。

在版本3.2中新增: pdb.py 现在接受一个-c 选项,该选项执行命令就像在。Pdbrc 文件,请参见调试器命令。

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

在 shell 提示符中输入以下命令启动 pdb:

python -m pdb 'python_script'

这个命令初始化 pdb,pdb 调试器将在 python _ script 的第一行中断,并等待您的输入:

(Pdb)

这是用于与调试器通信的接口。现在,您可以在这里指定您的命令。与在可视化调试器中使用按钮或键盘快捷方式相反,这里将使用命令派生相同的结果。

您可以通过命令“ n”(next)进入代码中的下一行:

(Pdb) n

执行下一步操作将显示行号和源代码中的特定代码:

> python_script(line number)method name
-> current line in the source code

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

(Pdb) b 50

这里,调试器被设置为在第50行中断。如果没有其他断点,那么第50行的断点将是第一个,并且可以通过断点 id (在本例中为1)来引用它。如果你增加了更多的断点,它们将会得到一系列的标识符(例如,2,3等等)

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

(Pdb) c

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

(Pdb) p variable_name

如果不再需要断点,可以用 clear 命令传递断点的 id 来清除断点:

(Pdb) clear 1

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

(Pdb) exit()

我希望这能帮助大家开始使用 PDB。下面是可用于调试器的命令列表: 所以问题和答案

在 Atom 中,如果安装了 Python 插件,只需输入‘ pdb’,然后按回车键,代码片段就会为您输入 import 和 trace back。

我现在已经习惯了,有时候我只是输入它,即使我在 vim 中编辑它,等待下拉菜单出现。

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

breakpoint()

Python3.7有一种新的设置断点的内置方法

breakpoint()

更多详情请看 https://stackoverflow.com/a/53263117/6488361

您可以将 Vim 与 巨蟒模式插件一起使用,也可以将 Emacs 与 艾比插件一起使用。

这些插件可以通过简单的击键提供断点(Vim 中的 \ b和 Emacs 中的 C-c C-u b) ,还有许多其他来自重量级 IDE 的特性(代码折叠、重构、 linting 等等)——所有这些都在一个轻量级的基于终端的文本编辑器中实现。

在整个运行过程中保存断点、别名和其他设置的最简单方法是使用。Pdbrc 与您的脚本放在同一个文件夹中,然后将脚本作为 python -m pdb <scriptname>.py运行

输入命令,就像在 pdb 中每行输入一个命令一样。 例如:

.\.pdbrc
--------
b 12
display var
c

通过这个代码片段,可以自动设置断点:

import pdb
import sys
try:
from io import StringIO           # Python3
except:
from StringIO import StringIO     # Python2


bp = 14    # or e.g. "submodule.py:123"


sys.stdin = StringIO('break %s\ncont\n' % bp)
pdb.set_trace()
sys.stdin = sys.__stdin__   # reset to usually stdin


print(1)     # lineno 14
print(2)

这种方法适用于 Python2和3。

也可以通过 .pdbrc文件(本地或本地)设置断点,并在运行时进行操作。但是,不能手动执行 cont命令。 因此,由于 pdb.set_trace需要 stdin,所以上面的代码只是以编程的方式“重定向”命令到 stdin。

将代码放在主程序中并与 argparse组合,可以从命令行传递断点,并进一步停止直到断点。

(我不希望在文件的顶部导入 pdb,因为我可能会忘记并将其保留在文件中)。

不像

import pdb; pdb.set_trace()

可以把进口部分留在后面,这是“原子”:

__import__('pdb').set_trace()