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: <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中的執行流程。
當代碼比較復雜,例如調用了一些第三方庫,這個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)<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]
斷點處可以執行的命令有:
- 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
參考:
Python調試工具