Python調(diào)試有助于編程環(huán)境的完善
Python調(diào)試在很多的時(shí)候都需要我們?nèi)プ觯?dāng)然在使用的過程中會(huì)出現(xiàn)各種的狀況。下面我們就來詳細(xì)的看下如何進(jìn)行有關(guān)Python的環(huán)境調(diào)試。希望大家有所收獲。
據(jù)聞winpdb、Wing IDE的調(diào)試器能夠支持這樣的遠(yuǎn)程調(diào)試,但似乎過于重量級(jí)(好吧前者比后者要輕多了,但一樣要wx Python調(diào)試的環(huán)境,再說pdb的靈活可靠它們難以比擬)。
其實(shí)只需稍作改動(dòng)即可用pdb繼續(xù)Python調(diào)試子進(jìn)程的代碼,思路來自這個(gè)博客:子進(jìn)程的stdin/out/err關(guān)閉了,那可以自己重新按/dev/stdout的名稱打開來用。當(dāng)然這指*nix下,win下要麻煩一些,后面再說。
pdb支持自定義輸出輸入的文件,我再稍作改動(dòng),使用fifo管道(Named Pipe)來完成pdb的輸出輸入的重定向,這樣的好處是,可以同時(shí)對(duì)父子進(jìn)程調(diào)試!
- multiproces_debug.py
- #!/usr/bin/python
- import multiprocessing
- import pdb
- def child_process():
- print "Child-Process"
- pdb.Pdb(stdin=open('p_in', 'r+'), stdout=open('p_out',
'w+')).set_trace()- var = "debug me!"
- def main_process():
- print "Parent-Process"
- p = multiprocessing.Process(target = child_process)
- p.start()
- pdb.set_trace()
- var = "debug me!"
- p.join()
- if __name__ == "__main__":
- main_process()
只需要給pdb的構(gòu)造參數(shù)傳入stdin/stdout的文件對(duì)象,調(diào)試過程的輸出輸入就自然以傳入的文件為方向了。這里需要兩個(gè)管道文件p_in、p_out,運(yùn)行腳本之前,使用命令mkfifo p_in p_out同時(shí)建立。這還未完成,還需要個(gè)外部程序來跟管道交互:
- #!/bin/bash
- cat p_out &
- while [[ 1 ]]; do
- read -e cmd
- echo $cmd>p_in
- done
很簡(jiǎn)單的bash。因?yàn)閒ifo管道在寫入端未傳入數(shù)據(jù)時(shí),讀取端是阻塞的(反之亦然),所以cat的顯示掛在后臺(tái),當(dāng)調(diào)試的程序結(jié)束后,管道傳出EOF,cat就自動(dòng)退出了。
實(shí)驗(yàn)開始:先在一個(gè)終端運(yùn)行debug_cmd.sh(其實(shí)順序無關(guān)),其光標(biāo)停在新的一行,再在另外一個(gè)終端運(yùn)行multiproces_debug.py,可見到兩個(gè)終端同時(shí)出現(xiàn)了(Pdb)的指示符,可以同時(shí)對(duì)父子進(jìn)程調(diào)試了!以上就是對(duì)Python調(diào)試的相關(guān)介紹。
【編輯推薦】