使用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 *= 3
    print(i)
    ''')
> <string>(2)<module>()
(Pdb) n                       # (Pdb)为调试命令提示符,表示可输入调试命令
> <string>(3)<module>()
(Pdb) n                       # n(next)表示执行下一行
> <string>(4)<module>()
(Pdb) print(i)                # 打印变量i的值
0
(Pdb) continue                # 继续运行程序
0
3
6

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                              # 最后得出表达式的值

pdb.runcall()函数

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

>>>基本用法如下

>>> help(pdb.runcall)
Help on function runcall in module pdb:

runcall(*args, **kwds)

>>>
参数含义

function:          函数名

args(kwds):        函数的参数

>>> 简单示例

>>> import pdb                           # 导入模块
>>> def sum(*args):                      # 定义函数sum,求所有参数之和
	res = 0
	for arg in args:
		res += arg
	return 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                                       # 函数最后返回结果

pdb.set_trace()函数

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

>>>基本用法如下

>>> help(pdb.set_trace)
Help on function set_trace in module pdb:

set_trace()

>>>简单示例

# file: test.py

import pdb

pdb.set_trace()
for i in range(5):
    i *= 5
    print(i)

运行脚本后显示:

> d:\learn\python\test.py(6)<module>()
-> for i in range(5):
(Pdb) list                     # 使用list列出脚本内容
  1  	# file: test.py
  2
  3  	import pdb
  4
  5  	pdb.set_trace()        # 使用set_trace()设置硬断点
  6  ->	for i in range(5):
  7  	    i *= 5
  8  	    print(i)
[EOF]                          # 列出脚本内容结束
(Pdb) continue                 # 使用continue继续执行
0
5
10
15
20

pdb调试命令

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

------------------------------------------------------------------------------
# 完整命令                    简写命令                      描述
------------------------------------------------------------------------------
# args                         a                            打印当前函数的参数
# break                        b                            设置断点
# clear                        cl                           清除断点
# condition                    无                           设置条件断点
# continue                     c                            继续运行,直到遇到断点或者脚本结束
# disable                      无                           禁用断点
# enable                       无                           启用断点
# help                          h                           查看pdb帮助
# ignore                       无                           忽略断点
# jump                         j                            跳转到指定行数运行
# list                         l                            列出脚本清单
# next                         n                            执行下条语句,遇到函数不进入其内部
# print                        p                            打印变量值
# quit                         q                            退出pdb
# return                       r                            一致运行到函数返回
# tbreak                       无                           设置临时断点、断点只中断一次
# step                         s                            执行下一条语句,遇到函数进入其内部
# where                        w                            查看所在的位置
# !                           无                           在pdb中执行语句                    
时间: 2024-10-12 22:02:58

使用pdb模块调试Python脚本的相关文章

使用pdb模块调试Python

在Python中,我们需要debug时,有三种方式: 加log语句.最简单的方式是添加print()语句来输出我们想要获知的状态或者变量,好处是简单容易操作,坏处是debug完了之后,还需要将print语句注释掉:进阶的方法是使用logging模块写log语句,这样做的好处是:能把log语句分级,并且能够根据参数决定输出什么样层级的log,用这种方法可以让我们不用注释掉log语句. 使用IDE(Intergrated Development Environment, 集成开发环境),比如Pych

Linux下使用pdb简单调试python程序

python自带调试工具库:pdb # -*- coding:utf-8 -*- def func(num): s = num * 10 return s if __name__ == '__main__': print 'debug starting...' print '*' * 10 print 'debug ending-' num = 100 s = func(num) print s 在python文件中不引用pdb库,可以在执行python文件的时候,加上参数: python -m

使用pdb调试python脚本

pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了一些常用的调试命令 命令 解释 break 或 b 设置断点 设置断点 continue 或 c 继续执行程序 list 或 l 查看当前行的代码段 step 或 s 进入函数 return 或 r 执行代码直到从当前函数返回 exit 或 q 中止并退出 next 或 n 执行下一行 pp 打印变

用PDB库调试Python程序

用pdb调试有多种方式可选: 1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前python -m pdb myscript.py 2 在程序中间插入一段程序,相对于在一般IDE里面打上断点然后启动debug,不过这种方式是hardcode的 import pdbpdb.set_trace()b = 2c = a + bprint (c)然后正常运行脚本,到了pdb.set_trace()那就会定下来,就可以看到调试的提示符(Pdb)了 常用的

[转] 用PDB库调试Python程序

Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的. 用pdb调试有多种方式可选: 1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前 python -m pdb myscript.py 2. 在Python交互环境中启用调试 >>> import pdb >>> import mymodule >>> pdb.run(‘mymodule

Linux通过使用pdb简单调试python计划

python自带的调试工具库:pdb # -*- coding:utf-8 -*- def func(num): s = num * 10 return s if __name__ == '__main__': print 'debug starting...' print '*' * 10 print 'debug ending-' num = 100 s = func(num) print s 在python文件里不引用pdb库,能够在运行python文件的时候,加上參数: python -

最简单方法远程调试Python多进程子程序

Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/err等文件都已关闭,pdb无法调用.据闻winpdb.Wing IDE的调试器能够支持这样的远程调试,但似乎过于重量级(好吧前者比后者要轻多了,但一样要wxPython的环境,再说pdb的灵活可靠它们难以比拟). 其实只需稍作改动即可用pdb继续调试子进程的代码,思路来自这个博客:子进程的stdi

C#调用python脚本

只尝试了两种调用方式,第一种只适用于python脚本中不包含第三方模块的情况,第二种针对的是python脚本中包含第三方模块的情况.不管哪种方式,首先都需要安装IronPython.可以在官网下载安装包自行安装后添加引用即可. C#代码 using IronPython.Hosting; using Microsoft.Scripting.Hosting; using System; namespace CSharpCallPython { class Program { static void

获得Python脚本所在目录

转自http://blog.chinaunix.net/uid-21961132-id-159389.html 1.? 以前的方法 如果是要获得程序运行的当前目录所在位置,那么可以使用os模块的os.getcwd()函数. 如果是要获得当前执行的脚本的所在目录位置,那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得.实际上sys.path是Python会去寻找模块的搜索路径列表,sys.path[0]和sys.argv[0]是一回事因为Python会自动把sys.