经过日志或者print来打印变量。必要时能够打印locals()
和globals()
html
建议使用logging.debug()来代替print,这样到了正式环境,就能够统一删除这些日志。python
Python有个trace模式,能够打印整个程序的执行流linux
# encoding=utf8 def f(): print 'aa' if __name__ == '__main__': f()
例如这段简单的程序,执行python -mtrace --trace test.py
就会输出下面的日志:redis
--- modulename: test, funcname: <module> # 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中的执行流程。windows
当代码比较复杂,例如调用了一些第三方库,这个trace日志就会很是多,因此最好重定向到一个文件里面,慢慢分析。ssh
# 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)<module>() -> 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]
断点处能够执行的命令有:工具
其余分支测试
上面几个库的接口和pdb都是同样的。ui
使用Pycharm这个IDE进行调试。这个功能就比较强大了。
Pycharm也支持远程调试。也就是在windows界面操做,进程运行在linux。
方法是:
Settings-Project Interpreter
里面点击Project Interpreter
右边的配置,点击AddSSH Interpreter
Existing Server configuration
New server configuration
,设置远程机的IP和ssh端口和用户名,密码等/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参考:
Python调试工具