1. 日志
通过日志或者print来打印变量。必要时可以打印locals()和globals()
建议使用logging.debug()来代替print,这样到了正式环境,就可以统一删除这些日志。
2.trace
Python有个trace模式,可以打印整个程序的执行流
# encoding=utf8
def f():
print "aa"
if __name__ == "__main__":
f()
例如这段简单的程序,执行python -mtrace –trace test.py就会输出下面的日志:
— modulename: test, funcname: # test模块,module级函数
test.py(2): def f(): #test.py的第2行,执行def f命令定义函数
test.py(6): if __name__ == "__main__":
test.py(7): f()
— modulename: test, funcname: f
test.py(3): print "aa"
aa
— modulename: trace, funcname: _unsettrace
trace.py(80): sys.settrace(None)
可以详细得看到这代代码在Python中的执行流程。
当代码比较复杂,例如调用了一些第三方库,这个trace日志就会非常多,所以最好重定向到一个文件里面,慢慢分析。
3.PDB
# encoding=utf8
import pdb
def f2():
a = 1
pdb.set_trace() # 设置断点
b = 2
c = a + b
pdb.set_trace()
if __name__ == "__main__":
f2()
在代码里面设置断点。执行代码python -mpdb test.py,就可以调试程序了。进程会在断点处暂停运行,等待我们执行命令
(vsing_env) [root@www script]# python -mpdb test.py
> /data/selfmoe_backend/script/test.py(2)()
-> import pdb
(Pdb) c
> /data/selfmoe_backend/script/test.py(13)f2()
-> b=2
(Pdb) p a
1
(Pdb) l
8 cli=redis.Redis(host="127.0.0.1",port="6801")
9 cli.get("test")
10 def f2():
11 a=1
12 pdb.set_trace()
13 -> b=2
14 c=a+b
15 pdb.set_trace()
16 if __name__ == "__main__":
17 f2()
[EOF]
断点处可以执行的命令有:
c continue 继续
q quit 退出
l list 显示断点前后的源码
w or where 回溯执行到当前断点的过程
d down 回溯的下一页
u up 回溯的上一页
回车 重复最后一个命令,例如就不用一直按c,可以只按回车
其他分支
ipdb pdb的基础上增加颜色,自动补齐
pudb gui版本
winpdb 远程调试,在windows调试linux的进程
上面几个库的接口和pdb都是一样的。
4.Pycharm
使用Pycharm这个IDE进行调试。这个功能就比较强大了。
Pycharm也支持远程调试。也就是在windows界面操作,进程运行在linux。
方法是:
在Settings-Project Interpreter 里面点击Project Interpreter右边的配置,点击Add
选择SSH Interpreter
如果已有远程同步代码配置,就选择Existing Server configuration
否则就选择New server configuration ,设置远程机的IP和ssh端口和用户名,密码等
设置远程机的Python地址,例如/data/env/bin/python
设置Sync folders。这个是windows和远程机的目录映射,例如E://project映射到/data/project。那如果执行E://project/test.py脚本就相当于执行/data/project/test.py脚本
创建测试的脚本,test.py
打开Run-Edit Configurations,修改test.py的Python interpreter为刚才设置的Remote Python
点击 run test.py 就能在远程机执行这个脚本了,console会展示远程机的console
除了run,也可以debug