只是一个方便的问题。我对 Visual Studio 和 XCode 等 IDE 中的调试器有点宠坏了。我发现必须键入import pdb; pdb.set_trace()
以设置断点有点笨拙(我宁愿不要在文件顶部导入 pdb,因为我可能会忘记并保留它)。
有没有更简单的方法在 Python 代码中设置断点,就像您在 IDE 中看到的一样简单明了?
您可以pdb
通过运行从命令行运行程序
python -m pdb your_script.py
它将在第一行中断,然后您可以使用该break
命令在代码中的任何位置添加断点,其语法为:
b(reak) [[文件名:]lineno | 函数[,条件]]
它足够灵活,可以让您在任何地方添加断点。
您可以使用:
from pdb import set_trace as bp
code
code
bp()
code
code
在 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、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 或您使用的任何其他语言添加类似的行。
Python 3.7+ 现在有内置函数breakpoint()
,可以替换import pdb; pdb.set_trace()
vim 中的前一个。它仍然工作相同。
所以这些天我做了很多 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
这些语言的断点或其他语言断点。然后这也很容易扩展到其他语言。我认为可以使用更好的自动命令来做到这一点 - 但我无法让它像这样可靠地工作。
我还没有尝试过,但他们只是在 Python 3.7 中实现了一个名为 breakpoint() 的新内置函数,这意味着您现在可以使用一条语句插入断点:
breakpoint()
如果您不想在每次运行程序时手动设置断点(在 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 文件中给出的一样,请参阅调试器命令。
这就是在命令行中使用 pdb 而不在源代码中实现任何内容的方式(文档和其他在线资源并不能很好地向过去只使用可视化调试器的程序员解释这一点):
通过在 shell 提示符下键入以下内容来启动 pdb:
python -m pdb 'python_script'
此命令初始化 pdb,pdb 调试器将在您的 python_script 的第一行中断并等待您的输入:
(Pdb)
这是与调试器通信的接口。现在,您可以在此处指定您的命令。与在可视化调试器中使用按钮或键盘快捷键相反,您将在这里使用命令来获得相同的结果。
您可以通过命令“n”(下一个)转到代码中的下一行:
(Pdb) n
执行 next 将显示行号,以及源代码中的特定代码:
> 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
您可以使用支持 python 调试的 IDE,或者您可以查看出色的 Winpdb 工具。它适用于任何平台,并为您的 python 脚本提供图形调试工具。
您可以使用:
以上所有内容都支持从 IDE 内部进行 python 调试。
在运行过程中保存断点、别名和其他设置的最简单方法是在与脚本相同的文件夹中使用 .pdbrc,然后将脚本运行为python -m pdb <scriptname>.py
像在 pdb 中一样输入命令,每行一个。例如:
.\.pdbrc
--------
b 12
display var
c
在 Atom 中,如果安装了 Python 插件,您只需输入 ' pdb
' 并按回车键,代码片段就会为您输入 import 和 trace back。
我现在已经习惯了,有时我只是输入它,即使我在 vim 中编辑它并等待下拉菜单出现。
您可以将 Vim 与Python-Mode插件一起使用,或者将 Emacs 与Elpy插件一起使用。
这些插件通过简单的击键(\ b
在 Vim 和C-c C-u b
Emacs 中)以及来自重量级 IDE 的许多其他功能(代码折叠、重构、linting 等)为您提供断点 - 所有这些都在基于终端的轻量级文本编辑器中。
使用此代码段可以自动设置断点:
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
,可以从命令行传递断点,并进一步停止直到断点。
在脚本上运行调试器的最简单方法就是
pdb your_script.py
在 Linux 命令行上运行 pdb 会给出
usage: pdb.py scriptfile [arg] ...