遇到大型 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; ld=uRGSyZllll2YYa4WlllllVAtUeYlllllWTieMkllll9llllljylll5@@@@@@@@@@; LSTMV=316,266; LCLKINT=3486; sct=61; ad=jkllllllll2Yg2o@lllllVANab9lllllbDIXhZllllwllllljOxlw@@@@@@@@@@@; 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 单步调试方法总结如下:
命令
解释 |
|
break 或 b 设置断点 |
设置断点 |
continue 或 c |
继续执行程序 |
list 或 l |
查看当前行的代码段 |
step 或 s |
进入函数 |
return 或 r |
执行代码直到从当前函数返回 |
exit 或 q |
中止并退出 |
next 或 n |
执行下一行 |
pp |
打印变量的值 |
a |
查看全部栈内变量 |
来源: http://www.cnblogs.com/wc554303896/p/7191158.html