python字符串输入小圆点_Python代码调试技巧

本文介绍了Python调试的多种方法,包括使用内置的pdb模块进行源代码调试,讲解了pdb的基本命令以及如何在Eric IDE中进行多线程调试。此外,还详细阐述了Python的logging模块,展示了如何设置不同日志级别、使用Filter以及在多线程环境中使用logging进行调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、使用pdb进行调试

pdb是Python自带的包,为Python提供一种交互的源代码调试功能。常用命令如下命令解释

break或b设置断点

continue或c继续执行程序

list或l查看当前代码段

step或s进入函数

return或r执行函数直到从当前函数返回

exit或q终止并退出(略暴力)

next或n执行下一行

pp或p打印变量的值

help帮助

pdb调试使用于单步跟踪等小型调试。它不支持多线程和远程调试,同时没有较为直观的界面显示,不适合大型的python项目。可以python IDE中自带的调试功能。

二、原文中讲述了Pycharm以及Eclipse with pydev的调试功能,这两种IDE我都没有用过,我就介绍一下我用的IDE——Eric的调试功能。。。

下面结合实例讲述如何用Eric进行多线程调试:#!/usr/bin/python

import thread

import time

# Define a function for the thread

def print_time( threadName, delay):

count = 0

while count 

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 或者选择菜单"Debug"->"Toggle Breakpoint",更为直接的方法是单击代码编辑处左侧边缘,可以看到出现红色的小圆点。

表达式求值:在调试过程中有的时候需要追踪一些表达式的值来发现程序中的问题,Pycharm 支持表达式求值,可以通过选中该表达式,然后选择“Debug”->”Evaluate”,或“Debug" -> "Excute"。输入要求值的表达式即可。在"Debug-viewer"(可在“Windows"->"Debug-viewer"打开)中可以查看全局变量和局部变量。

多线程:Setting -> Preference -> Debugger -> Python -> Multi Threaded,开启后在Debug-viewer下有一个Threads窗口,显示多线程,切换到相应的进程,变量栏就会显示与之相关的变量,进行调试即可。

三、使用日志功能进行调试

Python中自带的logging模块提供日志功能,将logger的level分为五个等级,可以通过Logger.setLevel(lvl)来设置。Level使用情形

DEBUG详细的情形,在追踪问题时使用

INFO正常的信息

WARNING一些不可预见的问题发生,或者将要发生,如磁盘空间低等,但不影响程序的运行

ERROR由于某些严重的问题,程序中的一些功能受到影响

CRITICAL严重的错误,或者程序本身不能够继续运行

logging lib 包含 4 个主要对象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 实例。

Handler:Handler

用来处理信息的输出,可以将信息输出到控制台,文件或者网络。可以通过 Logger.addHandler() 来给 logger 对象添加

handler,常用的 handler 有 StreamHandler 和 FileHandler 类。StreamHandler

发送错误信息到流,而 FileHandler 类用于向文件输出日志信息,这两个 handler 定义在 logging 的核心模块中。其他的

hander 定义在 logging.handles 模块中,如 HTTPHandler,SocketHandler。

Formatter:Formatter

则决定了 log 信息的格式 , 格式使用类似于 %(< dictionary key >)s

的形式来定义,如'%(asctime)s - %(levelname)s - %(message)s',支持的 key 可以在 python

自带的文档 LogRecord attributes 中查看。

Filter:Filter 用来决定哪些信息需要输出。可以被

handler 和 logger 使用,支持层次关系,比如如果设置了 filter 为名称为 A.B 的 logger,则该 logger

和其子 logger 的信息会被输出,如 A.B,A.B.C.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)会被过滤掉。

logging 的使用非常简单,同时它是线程安全的,下面结合多线程的例子讲述如何使用 logging 进行 debug。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 debugger的资料请参考原文的参考资料。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值