这篇文章主要讲解了“python调试工具pdb怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python调试工具pdb怎么使用”吧!pdb:python debugger1、非侵入式方法 (不用额外修改源代码,在命令行下直接运行就能调试)python3 -m pdb filename.py2、侵入式方法 (需要在被调试的代码中添加以下代码然后再正常运行代码)import pdb
pdb.set_trace()当你在命令行看到下面这个提示符时,说明已经正确打开了pdb(Pdb)在实际使用中发现,用shell脚本运行python文件时,可能无法用pdb调试,会退出。此时只能直接运行py文件来调试。比如下面的例子,要想进入到模型的 forward() 方法中查看前向传播过程中的数据处理过程,只能在 forward() 的第一行(即26行)设置断点,pdb.set_trace()但有时候模型很复杂,用这种方法会导致程序报错直接退出(我也不知道是什么原因),那么我们就可以考虑用 break 命令在这一行插入断点,使得程序运行到 forward() 时就会停下来。
importtorchimporttorch.nnasnnimportpdbclassEncoderLayer(nn.Module):def__init__(self):super().__init__() self.conv1=nn.Conv2d(4,10,(3,3)) self.conv2=nn.Conv2d(10,4,(3,3)) self.relu=nn.ReLU()defforward(self,x): x=self.relu(self.conv1(x))returnself.relu(self.conv2(x))classEncoder(nn.Module):def__init__(self,num_layers):super().__init__()#encoders由num_layers个EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList=nn.ModuleList([EncoderLayer()for_inrange(num_layers)])defforward(self,x):#ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 forlayerinself.ModelList: x=layer(x)returnxif__name__=="__main__": pdb.set_trace() input=torch.rand(5,4,30,30) model=Encoder(num_layers=4) output=model(input)
具体方法:
(1)首先在前面的任意一行设置 pdb.set_trace() ,使得程序停下来。
(2)输入 break 26 就可以了。如图:这样断点就设置成功了,程序运行到forward()就会停下来。这里的26是行数,需要注意的是 断点位置不能是注释,比如我们在25行(注释行)设置断点,就会失败:总结一下,在同一个文件中设置断点的命令是:break line如果想要设置的断点不在初始运行文件里面呢,怎么在其他文件中用break命令设置断点呢?我们看这个例子:把3.1的代码分为三个py文件,放下同一路径下:
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4b5d476ba5b14b0ba541d78930b9704a~tplv-k3u1fbpfcp-zoom-1.image)
看一下每个文件的内容:run.py:初始的 pdb.set_trace() 设置在run.py中。
importtorchfromencoderimportEncoderimportpdbif__name__=="__main__": pdb.set_trace()input=torch.rand(5,4,30,30) model=Encoder(num_layers=4) output=model(input)
encoder.py:
fromencoder_layerimportEncoderLayerimporttorch.nnasnnclassEncoder(nn.Module):def__init__(self,num_layers):super().__init__()#encoders由num_layers个EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList=nn.ModuleList([EncoderLayer()for_inrange(num_layers)])defforward(self,x):#ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 forlayerinself.ModelList: x=layer(x)returnx
encoder_layer.py:
importtorch.nnasnnclassEncoderLayer(nn.Module):def__init__(self):super().__init__() self.conv1=nn.Conv2d(4,10,(3,3)) self.conv2=nn.Co免费云主机域名nv2d(10,4,(3,3)) self.relu=nn.ReLU()defforward(self,x): x=self.relu(self.conv1(x))returnself.relu(self.conv2(x))
现在我们运行 run.py ,然后在 encoder.py 的第12行 设置断点,即for layer in self.ModelList:命令为:break encoder.py:12即 break filename:line我们可以看到,程序可以从 output = model(input) 进入到 forward() 中:这样可以很方便地进行调试。如果初始断点与目标断点不在同一个目录下的文件中,也可以通过相对路径下的文件名设置断点,如:
(Pdb)break../transformer/asr_model.py:91Breakpoint1at/local/wenet/examples/aishell/s0/wenet/transformer/asr_model.py:91(Pdb)
如图可以发现,pdb 有三行组成,第一行时文件路径,第二行是当前执行的代码行,第三行是输入命令行。在存在软链接时,pdb显示的路径是软链接指向的路径,但实际上的代码路径是拷贝了软连接内容的路径,这两个路径不一样,一定要注意。pdb有时候无法用 pdb.set_trace() 在模型的 forward() 方法中加入断点,报错内容为:Compiled functions can’t take variable number of arguments or use keyword-only arguments with defaul大概意思是 “编译后的函数不能接受数量可变的参数,也不能在default中使用仅关键字参数。”不懂啥意思,这个问题也没有解决。前面所述都是在程序开始运行时就插入断点,用pdb进行调试,即事前调试。其实 pdb 还可以进行事后调试,即在程序有bug运行奔溃后用python调试器进行查看。比如 test.py 显然是有 bug 的:
#test.pydefadd(n):returnn+1add("hello")
直接运行:python test.py程序奔溃:
F:PycharmProjectspytorch_practice>pythontest.py Traceback(mostrecentcalllast): File"test.py",line4,inadd("hello") File"test.py",line2,inadd returnn+1 TypeError:canonlyconcatenatestr(not"int")tostr
这样我们是无法用pdb进行调试的。那么当程序崩溃后,我们该怎样去调试呢?我们可以用下面这个命令进行简单调试:python -i test.py-i 选项可以让程序结束后打开一个交互式shell,如下:
F:PycharmProjectspytorch_practice>python-itest.py Traceback(mostrecentcalllast): File"test.py",line4,inadd("hello") File"test.py",line2,inadd returnn+1 TypeError:canonlyconcatenatestr(not"int")tostr >>>
现在我们发现程序结束后出现了 >>> 符号,这就是python调试器。输入命令:import pdb
pdb.pm()其中 pdb.pm() 用于程序发生异常导致奔溃后的事后调试,可以跟踪异常程序最后的堆在信息。执行命令后得到:
TypeError:canonlyconcatenatestr(not"int")tostr >>>importpdb >>>pdb.pm() >f:pycharmprojectspytorch_practicetest.py(2)add() ->returnn+1 (Pdb)
可以发现,pdb.pm() 已经追踪到了导致程序奔溃的语句:return n+1此时可以打印 n 的值进行检查:
(Pdb)pn'hello'(Pdb)q>>>quit() F:PycharmProjectspytorch_practice>
q 表示退出pdb调试,quit() 表示退出 python 调试器。感谢各位的阅读,以上就是“python调试工具pdb怎么使用”的内容了,经过本文的学习后,相信大家对python调试工具pdb怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章主要讲解了“es6数组中可不可以用展开符”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“es6数组中可不可以用展开符”吧! es6数组可以用展开符。展开符“…”会将可迭代对象展开到其单独的元素中,而所…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。