使用pdb模块调试Python脚本

在Python中,语法错误可以被Python解释器发现,但逻辑上错误或变量使用错误却不容易发现,如果结果没有符合预期,则需要调试,一个很好的调试工具:Python自带的pdb模块。pdb是Python自带的调试模块。使用pdb模块可以为脚本设置断点、单步执行、查看变量值等。

pdb可以用命令行参数的方式启动,也可以使用import 将其导入后再使用。

>>> dir(pdb)['Pdb', 'Repr', 'Restart', 'TESTCMD',…..,'re', 'run', 'runcall', 'runctx', 'runeval', 'set_trace', 'sys', 'test', 'traceback']

常见的pdb函数有以下几个:

【pdb.run()函数】

>>> 该函数主要用于调试语句块

>>> 基本用法如下

>>> help(pdb.run)Help on function run in module pdb:run(statement, globals=None, locals=None)

>>>参数含义

statement: 要调试的语句块,以字符串的形式表示

globals: 可选参数,设置statement运行的全局环境变量

locals: 可选参数,设置statement运行的局部环境变量

>>>简单示例

>>> import pdb# 导入调试模块>>> pdb.run('''# 调用run()函数执行一个for循环for i in range(3):i *= 3print(i)''')> <string>(2)<module>()(Pdb) n# (Pdb)为调试命令提示符,表示可输入调试命令> <string>(3)<module>()(Pdb) n# n(next)表示执行下一行> <string>(4)<module>()(Pdb) print(i)# 打印变量i的值0(Pdb) continue# 继续运行程序036

【pdb.runeval()函数】

>>>该函数主要用于调试表达式

>>>基本用法如下

>>> help(pdb.runeval)Help on function runeval in module pdb:runeval(expression, globals=None, locals=None)>>> 参数含义

expression:要调试的,

globals: 可选参数,设置statement运行的全局环境变量

locals: 可选参数,设置statement运行的局部环境变量

>>> 简单示例>>> import pdb# 导入pdb模块>>> lst = [1, 2, 3]# 定义一个列表>>> pdb.runeval('lst[1]')# 调用runaval()函数来调试表达式lst[1]> <string>(1)<module>()(Pdb) n# 进入调试状态,使用n命令,单步执行–Return–> <string>(1)<module>()->2(Pdb) n# 单步执行2# 返回表达式的值>>> pdb.runeval('3 + 5*6/2') # 使用runaval()函数来调试表达式3+5*6/2> <string>(1)<module>()->2(Pdb) n–Return–> <string>(1)<module>()->18(Pdb) n# 使用n命令单步执行18# 最后得出表达式的值

>>>该函数主要用于调试函数

>>>基本用法如下

>>> help(pdb.runcall)Help on function runcall in module pdb:runcall(*args, **kwds)>>> 参数含义function: 函数名

args(kwds): 函数的参数>>> 简单示例

>>> import pdb# 导入模块>>> def sum(*args):# 定义函数sum,求所有参数之和res = 0for arg in args:res += argreturn res>>> pdb.runcall(sum, 1, 2, 3, 4)# 使用runcall调试函数sum> <pyshell#53>(2)sum()(Pdb) n# 进入调试状态,单步执行> <pyshell#53>(3)sum()(Pdb) n# 单步执行> <pyshell#53>(4)sum()(Pdb) print(res)# 使用print打印res的值0(Pdb) continue# 继续执行10>>> pdb.runcall(sum, 1, 2, 3, 4, 5, 6) # 调用runcall调试函数sum,参数不同> <pyshell#53>(2)sum()(Pdb) continue# 继续执行21# 函数最后返回结果

>>>该函数主要用于脚本中设置硬断点

>>>基本用法如下

>>> help(pdb.set_trace)Help on function set_trace in module pdb:set_trace()>>>简单示例# file: test.pyimport pdbpdb.set_trace()for i in range(5):i *= 5print(i)运行脚本后显示:> d:\learn\python\test.py(6)<module>()-> for i in range(5):(Pdb) list# 使用list列出脚本内容 1 # file: test.py 23 import pdb 45 pdb.set_trace()# 使用set_trace()设置硬断点 6 ->for i in range(5): 7i *= 5 8print(i)[EOF]# 列出脚本内容结束(Pdb) continue# 使用continue继续执行05101520

pdb中的调试命令可以完成单步执行、打印变量值、设置断点等功能。pdb主要命令如下

——————————————————————————# 完整命令简写命令描述——————————————————————————# argsa打印当前函数的参数# breakb设置断点# clearcl清除断点# condition无设置条件断点# continuec继续运行,直到遇到断点或者脚本结束# disable无禁用断点# enable无启用断点# helph查看pdb帮助# ignore无忽略断点# jumpj跳转到指定行数运行# listl列出脚本清单# nextn执行下条语句,遇到函数不进入其内部# printp打印变量值# quitq退出pdb# returnr一致运行到函数返回# tbreak无设置临时断点、断点只中断一次# steps执行下一条语句,遇到函数进入其内部# wherew查看所在的位置# !无在pdb中执行语句>>>简单示例# -*- coding:gbk -*-# file: prime.py#import math# isprime函数判断一个整数是否为素数# 如果i能被2到i的平方根内的任意一个数整除,# 则i不是素数,返回0,否则i是素数,返回1。def isprime(i):for t in range(2, int(math.sqrt(i)) + 1):if i % t == 0:return 0print('100~110之间素数有: ')for i in range(100, 110):if isprime(i):print(i)

先运行下面命令:

d:\Learn\Python>python -m pdb prime.py后输入以下命令:

想念我的时候,不要忘记我也在想念你。

使用pdb模块调试Python脚本

相关文章:

你感兴趣的文章:

标签云: