Python调试技巧全解析
立即解锁
发布时间: 2025-09-03 01:39:48 阅读量: 4 订阅数: 6 AIGC 

### Python调试技巧全解析
#### 1. 通过日志进行调试
调试的核心在于检测程序内部的运行情况,找出意外或错误的影响。一种简单而有效的方法是在代码的关键部分输出变量和其他信息,让程序员能够跟踪程序的执行流程。
##### 1.1 打印调试
这种方法的最简单形式是打印调试,即在调试时在特定点插入打印语句,以打印变量的值或程序的关键位置。
##### 1.2 结合日志技术
将打印调试与日志技术相结合,可以创建程序执行的跟踪信息。这些跟踪信息在检测运行程序中的问题时非常有用,并且在使用测试框架运行测试时通常也会显示日志。
##### 1.3 准备工作
从GitHub下载`debug_logging.py`文件:[链接](https://github.com/PacktPublishing/Python-Automation-Cookbook-Second-Edition/blob/master/Chapter13/debug_logging.py)。该文件实现了冒泡排序算法,这是对元素列表进行排序的最简单方法之一。
```python
# 代码检查排序结果是否正确
assert [1, 2, 3, 4, 7, 10] == bubble_sort([3, 7, 10, 2, 4, 1])
```
##### 1.4 调试步骤
1. 运行`debug_logging.py`脚本,检查是否失败:
```bash
$ python debug_logging.py
INFO:Sorting the list: [3, 7, 10, 2, 4, 1]
INFO:Sorted list: [2, 3, 4, 7, 10, 1]
Traceback (most recent call last):
File "debug_logging.py", line 17, in <module>
assert [1, 2, 3, 4, 7, 10] == bubble_sort([3, 7, 10, 2, 4, 1])
AssertionError
```
2. 启用调试日志,修改`debug_logging.py`脚本的第二行:
```python
# 原代码
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO)
# 修改后
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
```
3. 再次运行脚本,查看更多信息:
```bash
$ python debug_logging.py
INFO:Sorting the list: [3, 7, 10, 2, 4, 1]
DEBUG:alist: [3, 7, 10, 2, 4, 1]
...
INFO:Sorted list : [2, 3, 4, 7, 10, 1]
Traceback (most recent call last):
File "debug_logging.py", line 17, in <module>
assert [1, 2, 3, 4, 7, 10] == bubble_sort([3, 7, 10, 2, 4, 1])
AssertionError
```
4. 分析输出,发现列表的最后一个元素未排序。分析代码,发现第7行存在越界错误,修改代码:
```python
# 原代码
for passnum in reversed(range(len(alist) - 1)):
# 修改后
for passnum in reversed(range(len(alist))):
```
5. 再次运行脚本,程序正常运行:
```bash
$ python debug_logging.py
INFO:Sorting the list: [3, 7, 10, 2, 4, 1]
...
INFO:Sorted list : [1, 2, 3, 4, 7, 10]
```
##### 1.5 日志调试的优缺点
优点是能够看到程序的执行流程,便于理解代码的执行顺序;缺点是可能会产生大量文本,而这些文本可能无法提供关于问题的具体信息。因此,需要在信息过多和过少之间找到平衡。
#### 2. 使用断点进行调试
Python有一个内置的调试器`pdb`,通过设置断点可以在代码的任意点停止执行,进入命令行模式,从而分析当前状态。
##### 2.1 准备工作
从GitHub下载`debug_algorithm.py`脚本:[链接](https://github.com/PacktPublishing/Python-Automation-Cookbook-Second-Edition/blob/master/Chapter13/debug_algorithm.py)。该脚本检查数字是否满足特定条件:
```python
def valid(candidate):
if candidate <= 1:
return False
lower = candidate - 1
while lower > 1:
if candidate / lower == candidate // lower:
return False
lower -= 1
return True
assert not valid(1)
assert valid(3)
assert not valid(15)
assert not valid(18)
assert not valid(50)
assert valid(53)
```
##### 2.2 调试步骤
1. 运行代码,确保所有断言都有效:
```bash
$ python debug_algorithm.py
```
2. 在`while`语句后、第7行之前添加`breakpoint()`:
```python
while lower > 1:
breakpoint()
if candidate / lower == candidate // lower:
```
3. 再次执行代码,程序在断点处停止,进入交互式`Pdb`模式:
```bash
$ python debug_algorithm.py
> .../debug_algorithm.py(8)valid()
-> if candidate / lower == candidate // lower:
(Pdb)
```
4. 检查`candidate`的值和两个操作:
```bash
(Pdb) candidate
3
(Pdb) candidate / lower
1.5
(Pdb) candidate // lower
1
```
5. 使用`n`继续执行到下一条指令,检查`while`循环是否结束并返回`True`:
```bash
(Pdb) n
> ...debug_algorithm.py(10)valid()
-> lower -= 1
...
(Pdb) n
--Return—
> ...debug_algorithm.py(12)valid()->True
-> return True
```
6. 使用`c`继续执行,直到找到下一个断点:
```bash
(Pdb) c
> ...debug_algorithm.py(8)valid()
-> if candidate / lower == candidate // lower:
(Pdb) cand
```
0
0
复制全文
相关推荐










