python debugger 线上 服务器端 代码调试神器 ipdb

写python代码的童鞋一般会在pc机器上使用IDE来调试自己的程序,那么如果一个python脚本或者一堆程序文件的代码在Linux环境上运行的时候出错了,我们该如何调试呢?在这里小店为各位客官推荐一款Linux 服务器端的python代码调试神器–ipdb.

传送门啊: https://pypi.org/project/ipdb/

1、安装

pip install ipdb

2、使用方式

两种使用方式,一种是在执行时指定python的运行模块,另一种是直接在代码中侵入式的方式。

python -m ipdb xxx.py

执行脚本或者程序时,带m参数的运行方式会从脚本的入口函数进入debug模式;这种方式没法精准快速的运行到你想要调试的代码位置。

def test():
  print("in test")
  from ipdb import set_trace
  set_trace()
  print("finish test")

第二种方式是直接在代码中import set_trace ,如下边test方法中,加入两行代码,之后保存退出。直接执行文件,那么直接就会在运行到你添加代码的位置暂停。一般会有如下图的效果。

python xxx.py
ipdb运行的debug模式样例

3、常用命令

无论哪种方式,运行代码到debug模式后,你需要通过命令来显示的调试你的代码。逐行逐句的找到代码可能出错的问题所在。一般会需要你在ipdb>后边输入对应的命令来进行后续的调试动作。

一行一行的运行代码是输入 n + 回车
进入方法内是输入 s + 回车
直接一次全部运行到最后是输入 c + 回车
….

  • ENTER(重复上次命令)
  • c(继续)
  • l(查找当前位于哪里)
  • s(进入子程序)
  • r(运行直到子程序结束)
  • !<python 命令>
  • h(帮助)
  • a(rgs) 打印当前函数的参数
  • j(ump) 让程序跳转到指定的行数
  • l(ist) 可以列出当前将要运行的代码块
  • n(ext) 让程序运行下一行,如果当前语句有一个函数调用,用 n 是不会进入被调用的函数体中的
  • p(rint) 最有用的命令之一,打印某个变量
  • q(uit) 退出调试
  • r(eturn) 继续执行,直到函数体返回
  • s(tep) 跟 n 相似,但是如果当前有一个函数调用,那么 s 会进入被调用的函数体中

4、可能会遇到的问题

问题一、TypeError: __init__() got an unexpected keyword argument ‘column‘

这是由于jedi这个库版本太高导致的不兼容,所以降一下版本即可:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jedi==0.17

问题二、AttributeError: ‘NoneType’ object has no attribute ‘tb_frame’

这是由于prompt-toolkit这个库版本太高导致的不兼容,所以降一下版本即可:

python -m pip install -U prompt-toolkit~=2.0

总结一下就是安装ipdb的时候不要默认安装最新的版本就会少很多问题,其实本质上就又回到了python不同模块不同版本兼容性的问题上,安装的时候尽可能安装次新版本即可避免很多问题。