写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

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不同模块不同版本兼容性的问题上,安装的时候尽可能安装次新版本即可避免很多问题。