如何逐步调试Python代码以解决问题?
在Java或C#中,你可以很方便地逐行查看代码,找出可能出错的地方,而且开发工具(IDE)让这个过程变得非常简单易用。
那么,在Python中,你能以类似的方式逐行查看代码吗?
14 个回答
在Python中,有一个叫做'pdb'的模块。在你的Python脚本开头,你可以这样写:
import pdb
pdb.set_trace()
这样你就进入了调试模式。在这个模式下,你可以用's'来单步执行,也可以用'n'来执行下一行,这和你在'gdb'调试器中做的很像。
使用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()
逐步调试,深入了解内部情况
执行下一条语句… 使用“n”(下一步)
重复上一个调试命令… 使用ENTER
退出所有… 使用“q”(退出)
打印变量的值… 使用“p” (打印)
a)
p a
关闭(Pdb)提示符… 使用“c”(继续)
查看当前位置… 使用“l”(列出)
进入子程序… 使用“s”(进入)
继续… 但只到当前子程序的结束… 使用“r”(返回)
赋值一个新值
a)
!b = "B"
设置断点
a)
break linenumber
b)
break functionname
c)
break filename:linenumber
临时断点
a)
tbreak linenumber
条件断点
a)
break linenumber, condition
注意:所有这些命令都应该在pdb中执行。
想要深入了解,可以参考:
没错!有一个叫做 pdb
的Python调试工具,专门用来做这个!
你可以通过 python -m pdb myscript.py
来启动一个Python程序并进入调试模式。
在调试过程中,你可以输入一些命令,这些命令的详细信息可以在 pdb
的页面上找到。
这里有一些比较实用的命令,记住它们会很有帮助:
b
: 设置一个断点c
: 继续调试,直到遇到断点s
: 一步一步执行代码n
: 跳到下一行代码l
: 列出当前文件的源代码(默认显示11行,包括正在执行的那一行)u
: 向上导航到上一个调用的地方d
: 向下导航到下一个调用的地方p
: 打印当前上下文中某个表达式的值
如果你不想使用命令行调试器,还有一些集成开发环境(IDE)像 Pydev、Wing IDE 或 PyCharm 提供图形界面的调试工具。Wing和PyCharm是商业产品,但Wing有一个免费的“个人”版本,而PyCharm也有一个免费的社区版。