經過日誌或者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調試工具