使用Python调试器
调试器是一个工具,它允许你打开应用程序的内部以找出需要修复的内容。 你可以查看变量和调用堆栈,设置条件断点,逐行扫描源代码,并执行需要执行的操作。
在调试时Python提供了更多的可能性——不仅可以查看过程中的代码,还可以运行在调试器命令行中编写的代码。
Python的秘密武器是它自己的内置调试器,称为pdb。简单的命令行界面具有你可能需要的所有基本调试器功能。但是当你寻找更复杂的东西时,你可以使用ipdb来扩展,这为调试器提供了一些来自IPython的额外功能。
最简单的使用方式是直接调用。
import pdb; pdb.set_trace()
运行解释器,一旦它到达这一行,你就会在你正在使用的程序终端上得到一个命令提示符。
列表(L)
使用list(l)
命令来查看Python解释器当前所在的代码行,也可以用来检查代码的不同区域。 它有第一和最后一行显示的参数。 但是,如果提供第一行的编号,那只能看到围绕特定行的代码。
(p)和(d)
up(p)
和down(d)
是用来浏览调用栈的命令。 例如,使用这两个函数来查看谁在调用当前函数,或者为什么解释器会这样。
step(s)和next(n)
另一对重要的命令是step(s)
和next(n)
。 它们之间的唯一区别是next(n)
只会进入当前函数的下一行,即使它调用了另一个函数, step(s)
将更深入。
break(b)
如果需要在不更改代码的情况下设置新断点,则使用break(b)
命令。
在此之前,简单介绍一下其他所有的pdb命令:

关于break
以前必须更改代码来打印某些内容或设置断点,有时必须在第三方包中设置断点。可以随时在虚拟环境中打开库的源代码并添加对pdb
的调用。
现在可以从调试器运行应用程序,并设置需要的断点,而无需更改任何源代码。使用命令python -m pdb <python script>
来执行调试器的应用程序。
示例:使用一个简单的应用程序跟踪工作时间。
在这个应用程序的内部,使用 requests
库来发出HTTP请求。使用调试器运行应用程序,并在所述库内设置断点来打破post请求。
$ python -m pdb run.py
> /Users/.........................../run.py(1)<module>()
-> from TimeLog.app import run_app
(Pdb) b requests/sessions.py:555
Breakpoint 1 at /..................../lib/python3.6/site-packages/requests/sessions.py:555
(Pdb) c
不必输入完整的源文件路径,只是从sys.path
中的某个文件夹中放入一个相对路径。
应用程序可能会运行很多调用,但有时你只需要一个特定的调用。那该怎么做? 在这种情况下,可以指定一个断点条件,只有当这个条件为True
,调试器才会中断应用程序。
在这个例子中,只有当json
有一个time_entry
键时,应用程序才会中断。
python -m pdb run.py
> /Users/...../run.py(1)<module>()
-> from TimeLog.app import run_app
(Pdb) b requests/sessions.py:555, json is not None and 'time_entry' in json
Breakpoint 1 at /Users/....../lib/python3.6/site-packages/requests/sessions.py:555
(Pdb) c
Django的调试助手
使用Django Web框架,如果DEBUG
在设置中设置为True
,那么在任何异常时都会获得一个包含以下信息的特殊页面:异常类型和消息,回溯,局部变量等。
安装django-extensions并使用runserver_plus
命令启动Django服务器。设置调试器引脚的操作方法:
WERKZEUG_DEBUG_PIN=1234 ./manage.py runserver_plus
通过使用django-extensions得到了一个追溯页面,可以看到每一行代码和一个打开的调试器。
然后在Werkzeug项目的帮助下执行调试过程,该项目是Python的WSGI库。
更多趣味实验可以直接访问实验楼,在线实验环境操作方便,为大家定期更新最佳实验!(●'◡'●)
网友评论