Python学习之单步调试详解

遇到大型python项目,如何定位问题和监控程序的运行状态是一个程序员必须掌握的技能,本文和大家分享的是python程序的单步调试方法,一起来看看吧,希望对大家学习python有所帮助。

首先你需要在所调试程序的开头中:import pdb 并在你的代码行设置断点:pdb.set_trace()

def get_input(Data, SuiteID, CaseID, caseinfolist):

global sArge

sArge=’’

args = []

#对于get请求,将参数组合

if reqmethod.upper()==’GET’:

for j in range(0, caseinfolist[1]):

if Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j) != "None":

ArgValue =  Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j)

if ’$$’ in ArgValue:#走关联分支

args = ArgValue.split(’$$’)

#print args

corvalue = Correl(args[0], args[1], args[2])

pdb.set_trace()   #######这儿设置断点,程序运行到此处就开始了单步调试###########

if corvalue == []:

sArge = ’correlerr’

#return sArge

#infolog="关联失败"

#ret1 = ’NG’

#Data.write_data(SuiteID, Data.casebegin+CaseID, 15,infolog,NG_COLOR)

#write_result(Date, SuiteID, Data.casebegin+CaseID, 16, ret1)

else:

sArge=sArge+caseinfolist[2][j]+’=’+corvalue[0]+’&’

else:

sArge=sArge+caseinfolist[2][j]+’=’+ArgValue+’&’

#print sArge

#去掉结尾的&字符

if sArge[-1:]==’&’:

sArge = sArge[0:-1]

#sInput=caseinfolist[0]+sArge    #为了post和get分开方便,不在这里组合接口名,在调用的地方组合接口名。

return sArge

#对于post请求,因为不知道连接格式是=还是冒号,或者是其他的格式,所以不做拼接。直接取参数的第一个作为上传body。

else:

sArge=Data.read_data(SuiteID, Data.casebegin+CaseID, 3)

if ’$$’ in sArge:#走关联分支

args = sArge.split(’$$’)

#print args

corvalue = Correl(args[0], args[1], args[2])

if corvalue == []:

sArge = ’correlerr’

return sArge

else:

return sArge

程序开始之后pdb调试界面:

> c:\\\\users\\\\wangchao\\\\workspace\\\\interface_test\\\\testframe.py(253)HTTPInvoke()

-> if reqmethod.upper()=="GET":

(Pdb) l                               #执行命令l,会显示出当前代码的上下文,下面的‘->’就是当前即将执行的代码

248      def HTTPInvoke(url,requestUri):

249          proto,rest=urllib.splittype(url)

250          host,rest =urllib.splithost(rest)

251          conn = httplib.HTTPConnection(host)

252          pdb.set_trace()

253  ->        if reqmethod.upper()=="GET":

254              print url

255              conn.request(reqmethod.upper(), url,headers=reqHeaders)

256              rsps = conn.getresponse()

257              if rsps.status==200:

258                  data = rsps.read()

(Pdb) reqmethod.upper()              #可以直接输入相关变量名称来查看当前变量的值

’GET’

(Pdb) n                              #n就是next的意思就是执行下一行

> c:\\\\users\\\\wangchao\\\\workspace\\\\interface_test\\\\testframe.py(254)HTTPInvoke()

-> print url

(Pdb) b 260                          #设置断点

Breakpoint 1 at c:\\\\users\\\\wangchao\\\\workspace\\\\interface_test\\\\testframe.py:260

(Pdb) n

> c:\\\\users\\\\wangchao\\\\workspace\\\\interface_test\\\\testframe.py(254)HTTPInvoke()

-> print url

(Pdb)

http://yue.sogou.com/api/h5/v1/history/recharge/list?pageNo=1&pageSize=1

> c:\\\\users\\\\wangchao\\\\workspace\\\\interface_test\\\\testframe.py(255)HTTPInvoke()

-> conn.request(reqmethod.upper(), url,headers=reqHeaders)

(Pdb) s                              #上面通过执行n程序运行到调用函数的地方,使用s可以进入函数内部

--Call--

> c:\\\\python27\\\\lib\\\\httplib.py(1040)request()

-> def request(self, method, url, body=None, headers={}):

(Pdb) a                              #显示当前所有栈变量的值

self = <httplib.HTTPConnection instance at 0x03A8CE68>

method = GET

url = http://yue.sogou.com/api/h5/v1/history/recharge/list?pageNo=1&pageSize=1

body = None

headers = {’Connection’: ’keep-alive’, ’Cookie’: ’SUV=004C0C0F6FCA67CB585CD8F53FC5D135; CXID=647977743F187E018526B8ECA587A052; IPLOC=CN1100; OPENID=6D4569C5D00A35876E60A94E34D685AD; pgv_pvi=2641157120; _ga=GA1.2.2141014782.1484890447; ssuid=5496173722; SMYUV=1485154923097202; sgsa_id=sogou.com|1486180882291442; GOTO=Af99046; clientId=291C8B8E05B2647F206981AD04136539; JSESSIONID=aaa_iPLt7BVjahJ1G5GOv; SNUID=FB57E5402F2A672762F7CB303085C13A; [email protected]@@@@@@@@@; LSTMV=316%2C266; LCLKINT=3486; sct=61; [email protected]@@@@@@@@@@@; SUID=7BC6CA017F430E0A0000000052256039; YYID=AA6E39EBC7D6CC4AA0839B4929E7511C; usid=pp63hL5QOQSxi2gw; sgid=AViadNOrPzjYb8SzAw5wsq5g’, ’Accept’: ’text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’, ’User-Agent’: ’Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0’}

(Pdb) l

1035                 self.__state = _CS_REQ_SENT

1036             else:

1037                 raise CannotSendHeader()

1038             self._send_output(message_body)

1039

1040 ->        def request(self, method, url, body=None, headers={}):

1041             """Send a complete request to the server."""

1042             self._send_request(method, url, body, headers)

1043

1044         def _set_content_length(self, body, method):

1045             # Set the content-length based on the body. If the body is "empty", we

(Pdb) r                                   #命令r返回到前面所进入函数的末尾

--Return--

> c:\\\\python27\\\\lib\\\\httplib.py(1042)request()->None

-> self._send_request(method, url, body, headers)

(Pdb) l                                   #可以通过l验证一下当前程序执行的位置

1037                 raise CannotSendHeader()

1038             self._send_output(message_body)

1039

1040         def request(self, method, url, body=None, headers={}):

1041             """Send a complete request to the server."""

1042 ->            self._send_request(method, url, body, headers)

1043

1044         def _set_content_length(self, body, method):

1045             # Set the content-length based on the body. If the body is "empty", we

1046             # set Content-Length: 0 for methods that expect a body (RFC 7230,

1047             # Section 3.3.2). If the body is set for other methods, we set the

(Pdb) r                                    #再执行r返回到调用该函数的地方

> c:\\\\users\\\\wangchao\\\\workspace\\\\interface_test\\\\testframe.py(256)HTTPInvoke()

-> rsps = conn.getresponse()

(Pdb) l

251          conn = httplib.HTTPConnection(host)

252          pdb.set_trace()

253          if reqmethod.upper()=="GET":

254              print url

255              conn.request(reqmethod.upper(), url,headers=reqHeaders)

256  ->            rsps = conn.getresponse()

257              if rsps.status==200:

258                  data = rsps.read()

259                  data = str(data)

260 B                conn.close()

261                  return data

(Pdb) c                                    #执行命令c继续运行程序,直到断点就停留在此位置,上面设置断点的命令“b 260”260表示第多少行

> c:\\\\users\\\\wangchao\\\\workspace\\\\interface_test\\\\testframe.py(260)HTTPInvoke()

-> conn.close()

(Pdb) l

255              conn.request(reqmethod.upper(), url,headers=reqHeaders)

256              rsps = conn.getresponse()

257              if rsps.status==200:

258                  data = rsps.read()

259                  data = str(data)

260 B->                conn.close()

261                  return data

262              elif rsps.status==301 or rsps.status==302:

263                  headerstr=rsps.getheaders()

264                  for i in headerstr:

265                      if i[0].lower()==’location’:

(Pdb) pp data                                # pp 打印某个变量的值

’{"code":0,"data":{"pageCount":0,"pageList":[],"pageNo":1,"pageSize":1,"totalCount":0},"msg":"\\\\xe6\\\\x88\\\\x90\\\\xe5\\\\x8a\\\\x9f"}’

(Pdb)

总结:上面的程序是本人私有,因而不能全部上传,在练习pdb时,建议使用自己的程序,pdb单步调试方法总结如下:

命令

来源:博客园

时间: 2024-10-31 13:31:33

Python学习之单步调试详解的相关文章

python学习之计算机基础详解

1.CPU详解 ·型号(x86-64) ? x86是指的CPU的型号,这种型号的CPU采用的是x86架构. ? 64是指CPU一次能够从内存中接受64位二进制数据:CPU具有向下兼容性,64位的CPU既能运行32位的程序也能运行64位的程序. ·内核态与用户态 ? CPU最核心的部分为控制其他硬件的指令集,指令集分为控制指令集和运算指令集: 当计算机运行操作系统的代码时,所有指令集都开放,此时称为CPU的内核态: 当计算机运行应用程序的代码时,只开放运算相关的指令集,此时称为CPU的用户态. ?

Python学习之高级函数详解

本文和大家分享的主要是python自动化运维中高级函数相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 那么这么来理解协程比较容易: 线程是系统级别的,它们是由操作系统调度:协程是程序级别的,由程序员根据需要自己调度.我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序:别的子程序也可以中断回来继续

Python学习之String模块详解

本文和大家分享的主要是python 中String 模块相关内容,一起来看看吧,希望对大家 学习python有所帮助. String 模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 str.capitalize() 把字符串的首字母大写 str.center(width) 将原字符串用空格填充成一个长度为 width 的字符串,原字符串内容居中 str.count(s) 返回字符串 s 在 str 中出现的次数 str.decode(encoding='

Python学习之ImportError 错误详解

本文和大家分享的主要是Python 的 ImportError 错误相关内容,一起来看看吧,希望对大家学习python有所帮助. 问题 错误:ImportError: No module named XXX 在Python的工程中,偶尔会遇到文件无法引用的情况,即PyCharm IDE支持文件跳转,但是当文件执行时,找不到模块. 例如,错误如下: Traceback (most recent call last): File "utils/average_clinic.py", lin

python中的tcp示例详解

python中的tcp示例详解  目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点 TCP简介 TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. TCP通信需要经过创建连接.数据传送.终止连接三个步骤. TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发

Python读写文本文档详解

以下3步问正确的程序片段: 1.写文件 #! /usr/bin/python3 'makeTextFile.py -- create text file' import os def write_file(): "used to write a text file." ls = os.linesep #get filename fname = input("Please input filename:") while True: if os.path.exists(

Shell学习之Bash变量详解(二)

Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这种变量中主要保存和系统操作环境相关的数据. 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的. 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的. Bash变量注意点 1.变量名称可以由字母.数字和下划线组成,但是不能以数字

Python中标准模块importlib详解

Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定义的对象,可用于引入过程(也称为importer). 什么是imp? 另外有一个叫做imp的模块,它提供给Python import语句机制的接口.这个模块在Python 3.4中被否决,目的就是为了只使用importlib. 这个模块有些复杂,因此我们在这

Linux学习总结之LVM2详解

大纲: 简介 版本 LVM基本术语 LVM模块 具体操作 对添加的硬盘进行分区( fdisk /dev/[hs]d[a-z] ) 对创建的分区创建物理卷(pvcreate) 给逻辑卷创建逻辑容器(卷组) 在卷组创建大小不同的逻辑卷(lvcreate) 给已存在的卷组扩大容量 实现在线扩大LVM容量 实现缩减LVM容量(不支持在线缩减) 减小卷组容量 利用给LVM创建快照,并完成备份并还原 简介: LVM是Logical Volume Manager(逻辑卷管理器)的简写,又译为逻辑卷宗管理器.逻