如何逐步调试Python代码以解决问题?

279 投票
14 回答
457110 浏览
提问于 2025-04-16 11:25

在Java或C#中,你可以很方便地逐行查看代码,找出可能出错的地方,而且开发工具(IDE)让这个过程变得非常简单易用。

那么,在Python中,你能以类似的方式逐行查看代码吗?

14 个回答

50

在Python中,有一个叫做'pdb'的模块。在你的Python脚本开头,你可以这样写:

import pdb
pdb.set_trace()

这样你就进入了调试模式。在这个模式下,你可以用's'来单步执行,也可以用'n'来执行下一行,这和你在'gdb'调试器中做的很像。

81

使用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 pdbset_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) p a

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

  6. 查看当前位置… 使用“l”(列出)

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

  8. 继续… 但只到当前子程序的结束… 使用“r”(返回)

  9. 赋值一个新值

    a) !b = "B"

  10. 设置断点

    a) break linenumber

    b) break functionname

    c) break filename:linenumber

  11. 临时断点

    a) tbreak linenumber

  12. 条件断点

    a) break linenumber, condition

注意:所有这些命令都应该在pdb中执行。

想要深入了解,可以参考:

373

没错!有一个叫做 pdb 的Python调试工具,专门用来做这个!

你可以通过 python -m pdb myscript.py 来启动一个Python程序并进入调试模式。

在调试过程中,你可以输入一些命令,这些命令的详细信息可以在 pdb 的页面上找到。

这里有一些比较实用的命令,记住它们会很有帮助:

  • b: 设置一个断点
  • c: 继续调试,直到遇到断点
  • s: 一步一步执行代码
  • n: 跳到下一行代码
  • l: 列出当前文件的源代码(默认显示11行,包括正在执行的那一行)
  • u: 向上导航到上一个调用的地方
  • d: 向下导航到下一个调用的地方
  • p: 打印当前上下文中某个表达式的值

如果你不想使用命令行调试器,还有一些集成开发环境(IDE)像 PydevWing IDEPyCharm 提供图形界面的调试工具。Wing和PyCharm是商业产品,但Wing有一个免费的“个人”版本,而PyCharm也有一个免费的社区版。

撰写回答