首页 - 通讯 - 如何调试Python?

如何调试Python?

2023-10-10 17:31

程序写一次就能正常运行的概率很小,基本不超过1%。总是有各种错误需要修复。有些错误非常简单。您可以通过查看错误消息来判断。有些错误非常复杂。当错误发生时,我们需要知道哪些变量有正确的值,哪些变量有错误的值。因此,我们需要一套完整的手段来调试程序。修复错误。下面的文章将为您介绍python调试方法。希望对您有所帮助。

# www.gsm-guard.net def foo(s): n = 整数 打印 '>>> n = %d' % n 返回 10/n def main(): 富('0') main()

登录后复制

执行后在输出中找到打印的变量值:

$ python www.gsm-guard.net
>>> n = 0
回溯(最近一次调用最后一次):
 ...
ZeropisionError: 整数 pision 或以零为模
登录后复制

使用 print 的最大缺点是以后必须将其删除。想想程序中到处都有打印,运行结果也会包含很多垃圾信息。

方法二:断言

凡是使用打印来辅助查看的地方,都可以使用断言来代替:

# www.gsm-guard.net
def foo(s):
  n = 整数
  断言 n != 0, 'n 为零!'
  返回 10/n

def main():
  foo('0')
登录后复制

assert表示表达式n != 0应该为True,否则下面的代码会出错。

如果断言失败,assert语句本身会抛出AssertionError:

$ python www.gsm-guard.net
回溯(最近一次调用最后一次):
 ...AssertionError: n is 0!
登录后复制

如果程序中充满了断言,那并不比打印好。但是,您可以使用 -O 参数在启动 Python 解释器时关闭断言:

$ python -O www.gsm-guard.net
回溯(最近一次调用最后一次):
 ...
ZeropisionError:整数pision或以零为模
登录后复制

关闭后可以查看所有assert语句为pass。

方法三:记录

您还可以用日志记录代替打印。与assert相比,logging不会抛出错误,并且可以输出到文件:

# www.gsm-guard.net
导入日志记录

s = '0'
n = 整数
日志记录.info('n = %d' % n)
print 10 / n
登录后,复制

www.gsm-guard.net(),输出一段文字。运行一下,发现除了ZeropisionError之外,没有任何信息。发生了什么?

不用担心,导入日志后添加一行配置再试:

导入日志记录
logging.basicConfig(level=www.gsm-guard.net)
登录后复制

查看输出:

$ python www.gsm-guard.net
信息:根:n = 0
回溯(最近一次调用最后一次):
 文件“www.gsm-guard.net”,第 8 行,位于 
  打印 10/nZeropisionError:整数pision或以零为模
登录后复制

这就是日志记录的好处。它允许您指定日志记录信息的级别。有debug、info、warning、error等几个级别。当我们指定level=INFO时,logging.debug将不起作用。同理,指定level=WARNING后,debug和info就不起作用了。这样就可以放心的输出不同级别的信息,而无需删除,最终控制输出哪级别的信息。

日志记录的另一个好处是,通过简单的配置,可以将一条语句同时输出到不同的地方,例如控制台和文件。

方法4:调试器pdb

启动Python调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先来准备一下节目吧:

# www.gsm-guard.net
s = '0'
n = 整数
打印 10 / n
登录后,复制

,然后开始:

$ python -m pdb www.gsm-guard.net
> /Users/michael/Github/sicp/www.gsm-guard.net(2)()
-> s = '0'
登录后复制

使用参数-m启动pdb后,pdb定位接下来要执行的代码 -> s = '0'。输入命令l查看代码:

(Pdb) l
 1#错误.py
 2 -> s = '0'
 3 n = 整数
 4 打印 10/n
[EOF]
登录后,复制

输入命令n,一步执行代码:

(Pdb) n
> /Users/michael/Github/sicp/www.gsm-guard.net(3)()
-> n = 整数
(Pdb) n
> /Users/michael/Github/sicp/www.gsm-guard.net(4)()
-> print 10 / n
登录后复制

可以随时输入命令p变量名查看变量:

(Pdb) p s
‘0’
(Pdb) p n
0
登录后,复制

输入命令q结束调试并退出程序: