Python的调试工具有很多,常用的有如下这些:pdb. Python内置的调试工具。
ipdb. 将Ipython功能引入pdb调试工具。
multiprocessing.dummy. 模拟的多进程。
pudb. 只支持Linux与macOS平台。
Pycharm. 其使用内置的pydev调试功能。
vscode. 其使用ptvsd。
这里讲述pudb的使用方法。
pudb调试多进程Python代码
安装
pip install pudb
使用方法
pudb的使用比较简洁,在需要调试的代码中加入set_trace即可。
from pudb import set_trace
set_trace()
然后使用pudb启动主程序:
python -m pudb.run my-script.py
调试过程
这里以multiprocessing多进程代码示例调试过程:
# -*- coding: utf-8 -*-
import os
from multiprocessing import Process
from pudb.remote import set_trace
def info(title):
print(title)
set_trace()
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
print('hello', name)
if __name__ == '__main__':
info('main line')
p = Process(target=f, args=('bob',))
p.start()
p.join()
启动的主程序后界面如下:
常用操作:?: 帮助页面。
n: 单步调试,当遇到函数调用时,不进入此函数体。
s: 单步执行,当遇到函数调用时,则进入此函数体。
b: 设置断点。
!: 跳转置左下角的Python命令行界面内。
ctrl+p: 调出配置界面。
o: 查看输出界面,但在子进程界面时此操作将会使界面卡住,官方下个版本将在子进程中禁止此功能。
当程序运行至p = Process(target=f, args=('bob',))代码行启动子进程时,弹出如下提示:
pudb:6899: Please telnet into 127.0.0.1 6899.
pudb:6899: Waiting for client...
这时,使用telnet 127.0.0.1 6899连接子进程的调试界面,连接成功后如下:
子进程停在print('module name:', __name__)代码行。子进程调试界面的操作与主进程一样,就不再赘述。
当然,调试Popen打开的子进程也类似用法,下面贴出示例代码:
主进程代码:
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE
if __name__ == '__main__':
cmd = ['python', 'subprocess_run.py']
process = Popen(cmd, stdin=PIPE)
process.stdin.close()
if process.wait() != 0:
print("There were some errors")
子程序代码subprocess_run.py:
# -*- coding: utf-8 -*-
from datetime import date
from pudb.remote import set_trace
def example_run():
today = date.today()
set_trace()
print('today is data: {}'.format(today))
if __name__ == '__main__':
example_run()