如何逐步处理Python代码以帮助调试问题?


185

在Java / C#中,您可以轻松地逐步执行代码以查找可能出了问题的地方,而IDE使此过程非常人性化。

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

Answers:


262

是! 有一个Python调试器pdb就是为了这样做!

您可以pdb使用pdb myscript.py或通过启动Python程序python -m pdb myscript.py。

然后,您可以发出一些命令,这些命令已在pdb页面中记录。

需要记住的一些有用的是:

  • b:设置一个断点
  • c:继续调试,直到遇到断点
  • s:单步执行代码
  • n:转到下一行代码
  • l:列出当前文件的源代码(默认值:11行,包括正在执行的行)
  • u:浏览堆栈框架
  • d:向下浏览堆栈框架
  • p:在当前上下文中打印表达式的值

如果您不想使用命令行调试器,则某些IDE(例如Pydev,Wing IDE或PyCharm)都具有GUI调试器。Wing和PyCharm是商业产品,但是Wing具有免费的“个人”版本,PyCharm具有免费的社区版本。


10
哇,我不敢相信我很难在linux / ubuntu上找到图形化的pdb。我想念什么吗?我可能不得不考虑为其制作SublimeText插件。
— ThorSummoner 2014年

4
PyCharm作为图形调试器非常出色,其Community Edition是免费的!
— Pieter'2

@ThorSummoner,pudb非常适合。还pydev
— alpha_989

pdb不是命令行工具。要使用它,请使用python -m pdb your_script.py。
— jdhao

@jdhao我想这不是标准的,但是在Ubuntu上,pdb命令是python软件包的一部分。无论如何,它python -m <module>也成为了其他事物的标准pip,因此默认情况下最好使用它。
— wjandrea

55

通过使用Python交互式调试器'pdb'

第一步是使Python解释器进入调试模式。

A.从命令行

从python解释器的命令行运行的最直接的方法

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B.口译员

在开发模块的早期版本并进行更多迭代实验时。

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C.从您的程序内部

对于大型项目和长时间运行的模块,可以使用import pdb和set_trace()从程序内部启动调试, 如下所示:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

分步调试进入更多内部

  1. 用“ n”执行下一条语句(下一个)

  2. 重复最后的调试命令与ENTER

  3. 用“ q”退出所有… (退出)

  4. 用“ p”打印变量的值…(打印)

    a) pa

  5. 用“ c”关闭(Pdb)提示(继续)

  6. 通过“ l”查看您的位置… (列表)

  7. 进入子程序…用“ s”(进入)

  8. 继续…但是直到当前子例程的结尾…用“ r”(返回)

  9. 分配新值

    a) !b =“ B”

  10. 设置断点

    a) 中断行号

    b) 中断函数名

    c) 中断filename:linenumber

  11. 临时断点

    a) 中断行号

  12. 条件断点

    a) 中断行号,条件

注意:**所有这些命令应从** pdb执行

有关深入的知识,请参阅:-

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/


41

python中有一个名为“ pdb”的模块。在python脚本的顶部,您可以执行

import pdb
pdb.set_trace()

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


21

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

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

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

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


2
当我看到breakpoint我很兴奋。但是后来我了解到,这实际上只是它的捷径import pdb; pdb.set_trace(),这让我很难过。Python开发人员:请专注于使用基本GDB功能(如上下文行,持久命令历史记录和制表符自动完成)来改进PDB :-)
— Ciro Santilli郝海东冠状病六四事件法轮功

11

ipdb(IPython调试器)

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

  • 制表符完成
  • 显示更多上下文行
  • 语法高亮

就像pdg一样,与GDB相比,ipdb仍然远远不够完善和完全初级,但是与pdb相比已经有了很大的改进。

用法类似于pdb,只需使用以下命令进行安装:

python3 -m pip install --user ipdb

然后添加到您要从中逐步调试的行:

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

您可能想从编辑器中为其添加快捷方式,例如,对于我拥有的Vim片段:

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

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

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

虽然-c c由于某种原因而损坏了:https : //github.com/gotcha/ipdb/issues/156

python -m module在以下位置询问了调试问题:如何从命令行调试使用python -m运行的Python模块?由于Python 3.7可以通过以下方式完成:

python -m pdb -m my_module

与GDB相比,pdb和ipdb严重缺少的功能:

ipdb的烦恼:

已在Ubuntu 16.04,ipdb == 0.11,Python 3.5.2中进行了测试。



3

如果您来自Java / C#背景,那么我猜您最好的选择是将Eclipse与Pydev一起使用。这为您提供了一个内置调试器的功能齐全的IDE。我也将其与django一起使用。




2

Python Tutor是面向新手的在线单步调试器。您可以在编辑页面上放入代码,然后单击“可视化执行”以开始运行。

除其他外,它支持:

但是它也不支持很多东西,例如:

  • 读取/写入文件-使用io.StringIO和io.BytesIO代替:演示
  • 代码太大,运行时间太长或定义了太多变量或对象
  • 命令行参数
  • 很多标准库模块,例如argparse,csv,枚举,html,os,struct,weakref ...



1

PyCharm是适用于Python的IDE,其中包含调试器。观看此YouTube视频,以获取有关使用PyCharm调试器逐步执行代码的介绍。

PyCharm教程-使用PyCharm调试python代码

注意:这并不是要背书或评论。PyCharm是一种需要付费的商业产品,但该公司确实向学生和教师提供了免费许可,以及免费和开放源代码的“轻量级”社区版本。

屏幕截图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.