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

时间:2011-08-08 10:24:14

标签: python pdb

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

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

15 个答案:

答案 0 :(得分:104)

您可以通过运行

从命令行将程序运行到pdb
  

python -m pdb your_script.py

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

  

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

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

答案 1 :(得分:51)

您可以使用:

from pdb import set_trace as bp

code
code
bp()
code
code

答案 2 :(得分:33)

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

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

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

似乎工作正常。其他大多数&#39;简单&#39;程序员编辑(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>

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

答案 3 :(得分:20)

如果您不想在每次运行程序时手动设置断点(在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文件中给出一样,请参阅调试器命令。

答案 4 :(得分:14)

I haven't tried it yet but they just implemented a new built-in called breakpoint() in Python 3.7 which means you can insert a breakpoint with one statement now:

breakpoint()

答案 5 :(得分:9)

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

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

python -m pdb 'python_script'

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

(Pdb)

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

您可以通过命令&#34; n&#34;转到代码中的下一行。 (下):

(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。以下是可以与调试器一起使用的命令列表:pdb so question and answers

答案 6 :(得分:4)

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

http://winpdb.org/

答案 7 :(得分:2)

您可以使用:

  • wing ide
  • 使用pydev插件进行eclipse
  • pycharms

以上所有内容都支持从IDE内部进行python调试。

答案 8 :(得分:2)

Python 3.7具有设置断点的新内置方式。打电话

breakpoint()

更多https://stackoverflow.com/a/53263117/6488361

答案 9 :(得分:0)

在Atom中安装了Python插件,您只需输入&#39; pdb&#39;然后按Enter键,代码片段将为您输入导入并追溯。

我已经习惯了这一点,即使我在vim中编辑它并等待下拉列表出现,有时我也会输入它。

答案 10 :(得分:0)

您可以将Vim与Python-Mode插件一起使用,或者将Emacs与Elpy插件一起使用。

这些插件可通过简单的击键(在Vim中为\ b和在Emacs中为C-c C-u b)为您提供断点,以及重量级IDE的许多其他功能(代码折叠,重构,整理等)-全部在基于轻量级终端的文本编辑器中。

答案 11 :(得分:0)

在运行过程中保存断点,别名和其他设置的最简单方法是,在脚本所在的文件夹中使用.pdbrc,然后以python -m pdb <scriptname>.py的身份运行脚本

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

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

答案 12 :(得分:0)

使用此代码段可以自动设置断点:

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)

这种方法适用于 Python 2 和 3。

断点也可以通过 .pdbrc 文件(在本地或在家中)设置并动态操作。尽管如此,cont 命令不得手动执行。 因此,由于 pdb.set_trace 需要标准输入,因此上面的代码只是以编程方式将命令“重定向”到标准输入。

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

答案 13 :(得分:-1)

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

pdb your_script.py

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

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

答案 14 :(得分:-1)

一种被低估的方法是直接在pdb中设置断点:

pdb> b torch/__init__:10

将在site-packages\torch\__init__.py:10上设置一个断点

然后pdb> c将在此断点处停止。

以下内容也有效:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

有关详细信息,请参见doc