与其他语言相比,Python中的调试总是比较“尴尬”。
大多数开发人员采取的方法是从标准库中导入pdb模块,并运行pdb.set_trace()从而在执行过程中进入控制台交互式调试会话。但这种方法存在一些重大问题:
每次都要输入import pdb; pdb.set_trace()比较麻烦。当你写了100多次后你可能会有肌肉记忆,但对新手来讲比较困难。
pdb不是唯一的调试器,只是最基本的。除了pdb以外还有很多更好的选择。
如果你写的不是控制台应用程序会怎么样呢?如果要在服务器或线程任务中设置断点,怎么开启调试会话呢?
新的断点方法
首先断点设置方法是一个函数,而不是关键字。所以你希望的是只在需要的那一行代码上加上断点,其他没有任何多余的操作。你需要一个breakpoint()方法,缺省实现会导入pdb和call()。
这会在命令行上产生一个pdb会话。
这已经比目前版本Python中的实现更直观了。
但是等等,还有问题
使用PYTHONBREAKPOINT环境变量可以禁用新的断点方法。所以如果你确实在代码中设置了断点,并且你只希望它执行一次,你可以将环境变量设为0。(输入PYTHONBREAKPOINT=pudb.set_trace python3.7 debugger.py)
这样再次调用相同的脚本就只是完成执行并跳过调用断点。
但是再等等,还有问题
PYTHONBREAKPOINT环境变量可以设置为可调用的名称,比如可以启动一个第三方调试库里调试会话的可调用函数。
pudb就是这样一个库。pudb是一个交互式控制台调试器,其关键字映射与pdb类似,但使用起来更容易。pudb已经存在很长时间了,支持Python2和3。
要使用pudb作为调试器,首先确保已经安装好它(通过pip install pudb),然后再将环境变量设为pudb.set_trace。
在命令行调用如下:PYTHONBREAKPOINT=pudb.set_trace python3.7 debugger.py
这相当于用breakpoint()方法替换import pudb; pudb.set_trace()
一切都很简洁。
远程调试和线程怎么办呢?
这个新的断点功能开启了一个有趣的用例。
在开发跨多个服务器或线程的分布式应用程序时,你可以使用本地调试器,如pudb。
当你部署到测试环境时,你可能不会从cli执行,而是从gevent或WSGI等进行调用。这是将Web服务或测试环境中的环境变量更改为允许远程连接的另一调试器的情况。
你可以使用web-pdb。 Web-pdb是一个远程调试器,可在断点触发时启动Web服务器,并可通过浏览器远程连接交互式调试会话。
如果你pip install web-pdb,那么你可以在调用breakpoint()函数的时候设置export PYTHONBREAKPOINT="web_pdb.set_trace"(无论它是否是后台进程),默认情况下你可以在端口5555上连接到服务,你将会看到这个界面:
英文原文:https://ogmcsrgk5.qnssl.com/vcdn/1/%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0%E9%95%BF%E5%9B%BE/python-3-7s-new-builtin-breakpoint-a-quick-tour-4f1aebc444c.png
译者:β
领取专属 10元无门槛券
私享最新 技术干货