Python代码调试的几种方法总结

使用 pdb 进行调试

pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情见表 1。
表 1. pdb 常用命令

下面结合具体的实例讲述如何使用 pdb 进行调试。
清单 1. 测试代码示例

import pdb
 a = "aaa"
 pdb.set_trace()
 b = "bbb"
 c = "ccc"
 final = a + b + c
 print final

开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。
清单 2. 利用 pdb 调试

[root@rcc-pok-idg-2255 ~]# python epdb1.py
 > /root/epdb1.py(4)?()
 -> b = "bbb"
 (Pdb) n
 > /root/epdb1.py(5)?()
 -> c = "ccc"
 (Pdb)
 > /root/epdb1.py(6)?()
 -> final = a + b + c
 (Pdb) list
 1   import pdb
 2   a = "aaa"
 3   pdb.set_trace()
 4   b = "bbb"
 5   c = "ccc"
 6 -> final = a + b + c
 7   print final
 [EOF]
 (Pdb)
 [EOF]
 (Pdb) n
 > /root/epdb1.py(7)?()
 -> print final
 (Pdb)

退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。
清单 3. 退出 debug

[root@rcc-pok-idg-2255 ~]# python epdb1.py
 > /root/epdb1.py(4)?()
 -> b = "bbb"
 (Pdb) n
 > /root/epdb1.py(5)?()
 -> c = "ccc"
 (Pdb) q
 Traceback (most recent call last):
 File "epdb1.py", line 5, in ?
  c = "ccc"
 File "epdb1.py", line 5, in ?
  c = "ccc"
 File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch
  return self.dispatch_line(frame)
 File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line
  if self.quitting: raise BdbQuit
 bdb.BdbQuit

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: < exceptions.NameError … ....> 错误。
清单 4. debug 过程中打印变量

[root@rcc-pok-idg-2255 ~]# python epdb1.py
 > /root/epdb1.py(4)?()
 -> b = "bbb"
 (Pdb) n
 > /root/epdb1.py(5)?()
 -> c = "ccc"
 (Pdb) p b
'bbb'
 (Pdb)
'bbb'
 (Pdb) n
 > /root/epdb1.py(6)?()
 -> final = a + b + c
 (Pdb) p c
'ccc'
 (Pdb) p final
 *** NameError: <exceptions.NameError instance at 0x1551b710 >
 (Pdb) n
 > /root/epdb1.py(7)?()
 -> print final
 (Pdb) p final
'aaabbbccc'
 (Pdb)

使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。
清单 5. 停止 debug 继续执行程序

[root@rcc-pok-idg-2255 ~]# python epdb1.py
 > /root/epdb1.py(4)?()
 -> b = "bbb"
 (Pdb) n
 > /root/epdb1.py(5)?()
 -> c = "ccc"
 (Pdb) c
 aaabbbccc

显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。
清单 6. debug 过程中显示代码

[root@rcc-pok-idg-2255 ~]# python epdb1.py
 > /root/epdb1.py(4)?()
 -> b = "bbb"
 (Pdb) list
 1   import pdb
 2   a = "aaa"
 3   pdb.set_trace()
 4 -> b = "bbb"
 5   c = "ccc"
 6   final = a + b + c
 7   pdb.set_trace()
 8   print final
 [EOF]
 (Pdb) c
 > /root/epdb1.py(8)?()
 -> print final
 (Pdb) list
 3   pdb.set_trace()
 4   b = "bbb"
 5   c = "ccc"
 6   final = a + b + c
 7   pdb.set_trace()
 8 -> print final
 [EOF]
 (Pdb)

在使用函数的情况下进行 debug
清单 7. 使用函数的例子

import pdb
 def combine(s1,s2):   # define subroutine combine, which...
  s3 = s1 + s2 + s1  # sandwiches s2 between copies of s1, ...
  s3 = '"' + s3 +'"'  # encloses it in double quotes,...
  return s3      # and returns it.
 a = "aaa"
 pdb.set_trace()
 b = "bbb"
 c = "ccc"
 final = combine(a,b)
 print final

如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。
清单 8. 对函数进行 debug

[root@rcc-pok-idg-2255 ~]# python epdb2.py
 > /root/epdb2.py(10)?()
 -> b = "bbb"
 (Pdb) n
 > /root/epdb2.py(11)?()
 -> c = "ccc"
 (Pdb) n
 > /root/epdb2.py(12)?()
 -> final = combine(a,b)
 (Pdb) s
 --Call--
 > /root/epdb2.py(3)combine()
 -> def combine(s1,s2):   # define subroutine combine, which...
 (Pdb) n
 > /root/epdb2.py(4)combine()
 -> s3 = s1 + s2 + s1  # sandwiches s2 between copies of s1, ...
 (Pdb) list
 1   import pdb
 2
 3   def combine(s1,s2):   # define subroutine combine, which...
 4 ->   s3 = s1 + s2 + s1  # sandwiches s2 between copies of s1, ...
 5     s3 = '"' + s3 +'"'  # encloses it in double quotes,...
 6     return s3      # and returns it.
 7
 8   a = "aaa"
 9   pdb.set_trace()
 10   b = "bbb"
 11   c = "ccc"
 (Pdb) n
 > /root/epdb2.py(5)combine()
 -> s3 = '"' + s3 +'"'  # encloses it in double quotes,...
 (Pdb) n
 > /root/epdb2.py(6)combine()
 -> return s3      # and returns it.
 (Pdb) n
 --Return--
 > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
 -> return s3      # and returns it.
 (Pdb) n
 > /root/epdb2.py(13)?()
 -> print final
 (Pdb)

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用! B。
清单 9. 在调试的时候动态改变值

[root@rcc-pok-idg-2255 ~]# python epdb2.py
 > /root/epdb2.py(10)?()
 -> b = "bbb"
 (Pdb) var = "1234"
 (Pdb) b = "avfe"
 *** The specified object '= "avfe"' is not a function
 or was not found along sys.path.
 (Pdb) !b="afdfd"
 (Pdb)

pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。接下来将介绍 PyCharm IDE 的调试方法 .
使用 PyCharm 进行调试

PyCharm 是由 JetBrains 打造的一款 Python IDE,具有语法高亮、Project 管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能,同时提供了对 Django 开发以及 Google App Engine 的支持。分为个人独立版和商业版,需要 license 支持,也可以获取免费的 30 天试用。试用版本的 Pycharm 可以在官网上下载,下载地址为:http://www.jetbrains.com/pycharm/download/index.html。 PyCharm 同时提供了较为完善的调试功能,支持多线程,远程调试等,可以支持断点设置,单步模式,表达式求值,变量查看等一系列功能。PyCharm IDE 的调试窗口布局如图 1 所示。
图 1. PyCharm IDE 窗口布局

下面结合实例讲述如何利用 PyCharm 进行多线程调试。具体调试所用的代码实例见清单 10。
清单 10. PyCharm 调试代码实例

__author__ = 'zhangying'
 #!/usr/bin/python
 import thread
 import time
 # Define a function for the thread
 def print_time( threadName, delay):
 count = 0
 while count < 5:
  count += 1
  print "%s: %s" % ( threadName, time.ctime(time.time()) )
 def check_sum(threadName,valueA,valueB):
 print "to calculate the sum of two number her"
 result=sum(valueA,valueB)
 print "the result is" ,result;
 def sum(valueA,valueB):
 if valueA >0 and valueB>0:
  return valueA+valueB
 def readFile(threadName, filename):
 file = open(filename)
 for line in file.xreadlines():
  print line
 try:
 thread.start_new_thread( print_time, ("Thread-1", 2, ) )
 thread.start_new_thread( check_sum, ("Thread-2", 4,5, ) )
 thread.start_new_thread( readFile, ("Thread-3","test.txt",))
 except:
 print "Error: unable to start thread"
 while 1:
 # print "end"
 pass

在调试之前通常需要设置断点,断点可以设置在循环或者条件判断的表达式处或者程序的关键点。设置断点的方法非常简单:在代码编辑框中将光标移动到需要设置断点的行,然后直接按 Ctrl+F8 或者选择菜单"Run"->"Toggle Line Break Point",更为直接的方法是双击代码编辑处左侧边缘,可以看到出现红色的小圆点(如图 2)。当调试开始的时候,当前正在执行的代码会直接显示为蓝色。下图中设置了三个断点,蓝色高亮显示的为正在执行的代码。
图 2. 断点设置

表达式求值:在调试过程中有的时候需要追踪一些表达式的值来发现程序中的问题,Pycharm 支持表达式求值,可以通过选中该表达式,然后选择“Run”->”Evaluate Expression”,在出现的窗口中直接选择 Evaluate 便可以查看。

Pychar 同时提供了 Variables 和 Watches 窗口,其中调试步骤中所涉及的具体变量的值可以直接在 variable 一栏中查看。
图 3. 变量查看

如果要动态的监测某个变量可以直接选中该变量并选择菜单”Run”->”Add Watch”添加到 watches 栏中。当调试进行到该变量所在的语句时,在该窗口中可以直接看到该变量的具体值。
图 4. 监测变量

对于多线程程序来说,通常会有多个线程,当需要 debug 的断点分别设置在不同线程对应的线程体中的时候,通常需要 IDE 有良好的多线程调试功能的支持。 Pycharm 中在主线程启动子线程的时候会自动产生一个 Dummy 开头的名字的虚拟线程,每一个 frame 对应各自的调试帧。如图 5,本实例中一共有四个线程,其中主线程生成了三个线程,分别为 Dummy-4,Dummy-5,Dummy-6. 其中 Dummy-4 对应线程 1,其余分别对应线程 2 和线程 3。
图 5. 多线程窗口

当调试进入到各个线程的子程序时,Frame 会自动切换到其所对应的 frame,相应的变量栏中也会显示与该过程对应的相关变量,如图 6,直接控制调试按钮,如 setp in,step over 便可以方便的进行调试。
图 6. 子线程调试

使用 PyDev 进行调试

PyDev 是一个开源的的 plugin,它可以方便的和 Eclipse 集成,提供方便强大的调试功能。同时作为一个优秀的 Python IDE 还提供语法错误提示、源代码编辑助手、Quick Outline、Globals Browser、Hierarchy View、运行等强大功能。下面讲述如何将 PyDev 和 Eclipse 集成。在安装 PyDev 之前,需要先安装 Java 1.4 或更高版本、Eclipse 以及 Python。 第一步:启动 Eclipse,在 Eclipse 菜单栏中找到 Help 栏,选择 Help > Install New Software,并选择 Add button,添加 Ptdev 的下载站点 http://pydev.org/updates。选择 PyDev 之后完成余下的步骤便可以安装 PyDev。
图 7. 安装 PyDev

安装完成之后需要配置 Python 解释器,在 Eclipse 菜单栏中,选择 Window > Preferences > Pydev > Interpreter – Python。Python 安装在 C:\Python27 路径下。单击 New,选择 Python 解释器 python.exe,打开后显示出一个包含很多复选框的窗口,选择需要加入系统 PYTHONPATH 的路径,单击 OK。
图 8. 配置 PyDev

在配置完 Pydev 之后,可以通过在 Eclipse 菜单栏中,选择 File > New > Project > Pydev >Pydev Project,单击 Next 创建 Python 项目,下面的内容假设 python 项目已经创建,并且有个需要调试的脚本 remote.py(具体内容如下),它是一个登陆到远程机器上去执行一些命令的脚本,在运行的时候需要传入一些参数,下面将详细讲述如何在调试过程中传入参数 .
清单 11. Pydev 调试示例代码

 #!/usr/bin/env python
 import os
 def telnetdo(HOST=None, USER=None, PASS=None, COMMAND=None): #define a function
 import telnetlib, sys
 if not HOST:
 try:
 HOST = sys.argv[1]
 USER = sys.argv[2]
 PASS = sys.argv[3]
 COMMAND = sys.argv[4]
 except:
 print "Usage: remote.py host user pass command"
 return
 tn = telnetlib.Telnet() #
 try:
 tn.open(HOST)
 except:
 print "Cannot open host"
 return
 tn.read_until("login:")
 tn.write(USER + '\n')
 if PASS:
 tn.read_until("Password:")
 tn.write(PASS + '\n')
 tn.write(COMMAND + '\n')
 tn.write("exit\n")
 tmp = tn.read_all()
 tn.close()
 del tn
 return tmp 

 if __name__ == '__main__':
 print telnetdo()

在调试的时候有些情况需要传入一些参数,在调试之前需要进行相应的配置以便接收所需要的参数,选择需要调试的程序(本例 remote.py),该脚本在 debug 的过程中需要输入四个参数:host,user,password 以及命令。在 eclipse 的工程目录下选择需要 debug 的程序,单击右键,选择“Debug As”->“Debug Configurations”,在 Arguments Tab 页中选择“Variables”。如下 图 9 所示 .
图 9. 配置变量

在窗口”Select Variable”之后选择“Edit Varuables” ,出现如下窗口,在下图中选择”New” 并在弹出的窗口中输入对应的变量名和值。特别需要注意的是在值的后面一定要有空格,不然所有的参数都会被当做第一个参数读入。
图 10. 添加具体变量

按照以上方式依次配置完所有参数,然后在”select variable“窗口中安装参数所需要的顺序依次选择对应的变量。配置完成之后状态如下图 11 所示。
图 11. 完成配置

选择 Debug 便可以开始程序的调试,调试方法与 eclipse 内置的调试功能的使用相似,并且支持多线程的 debug,这方面的文章已经有很多,读者可以自行搜索阅读,或者参考”使用 Eclipse 平台进行调试“一文。
使用日志功能达到调试的目的

日志信息是软件开发过程中进行调试的一种非常有用的方式,特别是在大型软件开发过程需要很多相关人员进行协作的情况下。开发人员通过在代码中加入一些特定的能够记录软件运行过程中的各种事件信息能够有利于甄别代码中存在的问题。这些信息可能包括时间,描述信息以及错误或者异常发生时候的特定上下文信息。 最原始的 debug 方法是通过在代码中嵌入 print 语句,通过输出一些相关的信息来定位程序的问题。但这种方法有一定的缺陷,正常的程序输出和 debug 信息混合在一起,给分析带来一定困难,当程序调试结束不再需要 debug 输出的时候,通常没有很简单的方法将 print 的信息屏蔽掉或者定位到文件。python 中自带的 logging 模块可以比较方便的解决这些问题,它提供日志功能,将 logger 的 level 分为五个级别,可以通过 Logger.setLevel(lvl) 来设置。默认的级别为 warning。
表 2. 日志的级别

ogging lib 包含 4 个主要对象

  1. logger:logger 是程序信息输出的接口。它分散在不同的代码中使得程序可以在运行的时候记录相应的信息,并根据设置的日志级别或 filter 来决定哪些信息需要输出并将这些信息分发到其关联的 handler。常用的方法有 Logger.setLevel(),Logger.addHandler() ,Logger.removeHandler() ,Logger.addFilter() ,Logger.debug(), Logger.info(), Logger.warning(), Logger.error(),getLogger() 等。logger 支持层次继承关系,子 logger 的名称通常是父 logger.name 的方式。如果不创建 logger 的实例,则使用默认的 root logger,通过 logging.getLogger() 或者 logging.getLogger("") 得到 root logger 实例。
  2. Handler:Handler 用来处理信息的输出,可以将信息输出到控制台,文件或者网络。可以通过 Logger.addHandler() 来给 logger 对象添加 handler,常用的 handler 有 StreamHandler 和 FileHandler 类。StreamHandler 发送错误信息到流,而 FileHandler 类用于向文件输出日志信息,这两个 handler 定义在 logging 的核心模块中。其他的 hander 定义在 logging.handles 模块中,如 HTTPHandler,SocketHandler。
  3. Formatter:Formatter 则决定了 log 信息的格式 , 格式使用类似于 %(< dictionary key >)s 的形式来定义,如'%(asctime)s - %(levelname)s - %(message)s',支持的 key 可以在 python 自带的文档 LogRecord attributes 中查看。
  4. Filter:Filter 用来决定哪些信息需要输出。可以被 handler 和 logger 使用,支持层次关系,比如如果设置了 filter 为名称为 A.B 的 logger,则该 logger 和其子 logger 的信息会被输出,如 A.B,A.B.C.

清单 12. 日志使用示例

import logging
 LOG1=logging.getLogger('b.c')
 LOG2=logging.getLogger('d.e')
 filehandler = logging.FileHandler('test.log','a')
 formatter = logging.Formatter('%(name)s %(asctime)s %(levelname)s %(message)s')
 filehandler.setFormatter(formatter)
 filter=logging.Filter('b')
 filehandler.addFilter(filter)
 LOG1.addHandler(filehandler)
 LOG2.addHandler(filehandler)
 LOG1.setLevel(logging.INFO)
 LOG2.setLevel(logging.DEBUG)
 LOG1.debug('it is a debug info for log1')
 LOG1.info('normal infor for log1')
 LOG1.warning('warning info for log1:b.c')
 LOG1.error('error info for log1:abcd')
 LOG1.critical('critical info for log1:not worked')
 LOG2.debug('debug info for log2')
 LOG2.info('normal info for log2')
 LOG2.warning('warning info for log2')
 LOG2.error('error:b.c')
 LOG2.critical('critical')

上例设置了 filter b,则 b.c 为 b 的子 logger,因此满足过滤条件该 logger 相关的日志信息会 被输出,而其他不满足条件的 logger(这里是 d.e)会被过滤掉。
清单 13. 输出结果

b.c 2011-11-25 11:07:29,733 INFO normal infor for log1
 b.c 2011-11-25 11:07:29,733 WARNING warning info for log1:b.c
 b.c 2011-11-25 11:07:29,733 ERROR error info for log1:abcd
 b.c 2011-11-25 11:07:29,733 CRITICAL critical info for log1:not worked

logging 的使用非常简单,同时它是线程安全的,下面结合多线程的例子讲述如何使用 logging 进行 debug。
清单 14. 多线程使用 logging

logging.conf
 [loggers]
 keys=root,simpleExample 

 [handlers]
 keys=consoleHandler 

 [formatters]
 keys=simpleFormatter 

 [logger_root]
 level=DEBUG
 handlers=consoleHandler 

 [logger_simpleExample]
 level=DEBUG
 handlers=consoleHandler
 qualname=simpleExample
 propagate=0 

 [handler_consoleHandler]
 class=StreamHandler
 level=DEBUG
 formatter=simpleFormatter
 args=(sys.stdout,) 

 [formatter_simpleFormatter]
 format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
 datefmt= 

 code example:
 #!/usr/bin/python
 import thread
 import time
 import logging
 import logging.config
 logging.config.fileConfig('logging.conf')
 # create logger
 logger = logging.getLogger('simpleExample')
 # Define a function for the thread
 def print_time( threadName, delay):
 logger.debug('thread 1 call print_time function body')
 count = 0
 logger.debug('count:%s',count)

总结

全文介绍了 python 中 debug 的几种不同的方式,包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试,希望能给相关 python 使用者一点参考。更多关于 python debugger 的资料可以参见参考资料。

时间: 2015-04-12

使用Python中PDB模块中的命令来调试Python代码的教程

你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,Python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便.本文是一篇快速教程,希望它能让你的编码生活更加容易. 1. 一个混乱的程序 出于本教程的目的,让我们研究一下下面的简单程序. 这个程序接收两个命令行参数,然后执行加法和减法操作. (假设用户输入的是有效值,因此代码中我们没有进行错误处理.) import sys def add(num1=0, n

Python中使用PDB库调试程序

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

使用PDB简单调试Python程序简明指南

在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入 pdb 模块(假设要调试的程序名为 d.py): 复制代码 代码如下: $ vi d.py #!/usr/bin/python def main():         i, sum = 1, 0         for i in xrange(100):                 sum = sum + i         print sum if __name__ == '__main__'

总结用Pdb库调试Python的方式及常用的命令

用Pdb调试有多种方式 使用 Pdb调试 Python的程序的方式主要是下面的三种!下面逐一介绍 命令行加-m参数 命令行启动目标程序,加上-m参数,这样调用 testPdb.py的话断点就是程序执行的第一行之前 本文接下来重点讲到的实例展示就是使用这种方式进行调试的! python -m pdb testPdb.py 在python交互环境调试 >>> import pdb >>> import testPdb >>> pdb.run('testPd

调试Python程序代码的几种方法总结

程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug. 第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看: # err.py def foo(s): n = int(s) print '>>> n = %d' % n return 10 / n def main(): f

在Linux下调试Python代码的各种方法

这是一个我用于调试或分析工具概述,不一定是完整全面,如果你知道更好的工具,请在评论处标记. 日志 是的,的确,不得不强调足够的日志记录对应用程序是多么的重要.您应该记录重要的东西,如果你的记录足够好的话,你可以从日志中找出问题从而节省大量的时间. 如果你曾经用print语句来调试代码现在停下吧,用logging.debug替代,开始可以慢慢来,以后完全禁用它... 追踪 有时看到程序如何被执行会很有帮助.你可以使用IDE的调试共轭ngn一步一步的运行程序,但你需要知道你要找的是什么,否则这将会是

使用PDB模式调试Python程序介绍

以前在windows下一直用的idel带的功能调试python程序,在linux下没调试过.(很多时候只是print)就从网上查找一下~ 方法: 复制代码 代码如下: python -m pdb a.py a.py是python文件. (Pdb)模式下的常用命令: q 退出debug h 即help,打印所有可以命令 h w 打印命令 w 的含意 n 执行当前行直到到达下一行或直到它返回 s 执行当前行,一有可能就停止(比如当前行有一个函数调用).它和n(next)的区别是当前行中有函数调用时s

使用pdb模块调试Python程序实例

在Python中,语法错误可以被Python解释器发现,但逻辑上错误或变量使用错误却不容易发现,如果结果没有符合预期,则需要调试,一个很好的调试工具:Python自带的pdb模块.pdb是Python自带的调试模块.使用pdb模块可以为脚本设置断点.单步执行.查看变量值等. pdb可以用命令行参数的方式启动,也可以使用import 将其导入后再使用. 复制代码 代码如下: >>> dir(pdb)  ['Pdb', 'Repr', 'Restart', 'TESTCMD',.....,'

python pdb调试方法分享

复制代码 代码如下: import pdb def pdb_test(arg):    for i in range(arg):        print(i)    return arg pdb.run("pdb_test(3)") b 函数名.行号: 打断点,b可以查询所有的断点. 复制代码 代码如下: (Pdb) b pdb_testBreakpoint 1 at c:\users\plpcc\desktop\pdbtest.py:3(Pdb) bNum Type        

快速查询Python文档方法分享

Pydoc本地HTML形式查看 我们在编写Python代码时,常常会去查询某些模块及函数的使用,会选择dir()及help()函数.或查看CHM格式的Python帮助文档.或查看Python对应文件的源码.或网上搜索等方式. 这边提供一个本地快速查询Python文档的方式:将pydoc文档以本地HTML形式来查看:不论是Python内建模块,还是你本机已下载的三方模块,都能查看得到,且能定位到你本机的文件地址. 先来看下HTML页面的显示,首页如下,可使用浏览器CTRL+F搜索当前页面,快速定位

ubunt18.04LTS+vscode+anaconda3下的python+C++调试方法

1.安装背景 最近想放弃windows编程环境,转到linux.原因就一个字:潮 从格式化所有硬盘,到安装win10/ubuntu18.04双系统,其中的痛苦,我想只有经历过的人才会知道. 在这里,我还是提一些安装双系统的几点建议吧: ① 先装win10,我是使用老毛桃在线安装的专业版 ② 装ubuntu很烦人,本以为通过教程(先下载iso,再制作启动u盘,再修改bios中的u盘优先启动方式)就可以了,最终无果.我只好用实验室同学已经制作好的ubuntu 启动盘进行安装,结果开启出现了gnru,

vc6编写python扩展的方法分享

系统环境:VC6 + Python-2.5.4 1.下载Python-2.5.4源码. 2.解压,打开D:\Python-2.5.4\PC\VC6\pcbuild.dsw,编译,D:\Python-2.5.4\PC\VC6\下得到python25.dll.python25_d.dll.python25.lib.python25_d.lib. 3.使用VC6建立一个动态链接库工程,拷贝D:\Python-2.5.4\PC\example_nt\example.c到工程目录下,并添加到工程中. 4.

python中调试或排错的五种方法示例

前言 本文主要给大家介绍了关于python中调试或排错的五种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的的介绍吧 python调试或排错的五种方法 1.print,直接打印,比较简单而且粗暴 在代码中直接输入print+需要输出的结果,根据打印的内容判断即可 2.assert断言,很方便,测试人员常常在写自动化用例的时候用的比较多 如下,直接将预期结果和实际结果做判断 def true_code(): x = 3 y = 2 z = x + y assert(5==z), "z

利用Pycharm断点调试Python程序的方法

1.代码 准备没有语法错误的Python程序: #!/usr/bin/python import numpy as np class Network: def __init__(self,sizes): self.num_layers=len(sizes) self.sizes=sizes self.biases=[np.random.randn(y,1) for y in sizes[1:]] self.weights=[np.random.randn(x,y) \ for x,y in zi

python的pdb调试命令的命令整理及实例

python的pdb调试命令的命令整理及实例 一.命令整理 pdb调试命令 完整命令 简写命令 描述 args a 打印当前函数的参数 break b 设置断点 clear cl 清除断点 condition 无 设置条件断点 continue c或者cont 继续运行,知道遇到断点或者脚本结束 disable 无 禁用断点 enable 无 启用断点 help h 查看pdb帮助 ignore 无 忽略断点 jump j 跳转到指定行数运行 list l 列出脚本清单 next n 执行下条语

python中常用的九种预处理方法分享

本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(Standardization or Mean Removal and Variance Scaling) 变换后各维特征有0均值,单位方差.也叫z-score规范化(零均值规范化).计算方式是将特征值减去均值,除以标准差. sklearn.preprocessing.scale(X) 一般会把train和test集放在一起做标准化,或者在train集上做标准化

Python利用QQ邮箱发送邮件的实现方法(分享)

废话不多说,直接上代码 Python2.7 #!/usr/bin/env python2.7 # -*- coding=utf-8 -*- import smtplib from email.mime.text import MIMEText _user = "648613081@qq.com" _pwd = "这里改成你的授权码" _to = "648613081@qq.com" msg = MIMEText("this is a e