最簡單方法遠端偵錯Python多進程子程式

來源:互聯網
上載者:User

標籤:

Python 2.6新增的multiprocessing,即多進程,給子進程代碼調試有點困難,比如python內建的pdb如果直接在子進程代碼裡面啟動會拋出一堆異常,原因是子進程的stdin/out/err等檔案都已關閉,pdb無法調用。據聞winpdb、Wing IDE的調試器能夠支援這樣的遠端偵錯,但似乎過於重量級(好吧前者比後者要輕多了,但一樣要wxPython的環境,再說pdb的靈活可靠它們難以比擬)。

其實只需稍作改動即可用pdb繼續調試子進程的代碼,思路來自這個部落格:子進程的stdin/out/err關閉了,那可以自己重新按/dev/stdout的名稱開啟來用。當然這指*nix下,win下要麻煩一些,後面再說。

pdb支援自訂輸出輸入的檔案,我再稍作改動,使用fifo管道(Named Pipe)來完成pdb的輸出輸入的重新導向,這樣的好處是,可以同時對父子進程調試!

multiproces_debug.py

#!/usr/bin/python import multiprocessingimport 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的構造參數傳入stdin/stdout的檔案對象,調試過程的輸出輸入就自然以傳入的檔案為方向了。這裡需要兩個管道檔案p_in、p_out,運行指令碼之前,使用命令mkfifo p_in p_out同時建立。這還未完成,還需要個外部程式來跟管道互動:

debug_cmd.sh

#!/bin/bash cat p_out &while [[ 1 ]]; do    read -e cmd    echo $cmd>p_indone

 

很簡單的bash。因為fifo管道在寫入端未傳入資料時,讀取端是阻塞的(反之亦然),所以cat的顯示掛在後台,當調試的程式結束後,管道傳出EOF,cat就自動結束了。

實驗開始:先在一個終端運行debug_cmd.sh(其實順序無關),其游標停在新的一行,再在另外一個終端運行multiproces_debug.py,可見到兩個終端同時出現了(Pdb)的指示符,可以同時對父子進程調試了!

 

在Windows下使用管道就沒這麼方便了,因為沒有實體的管道檔案支援,可以考慮使用socket的類檔案對象傳給pdb。但這樣要寫的python代碼就多一點,以及要另外用做個互動程式;不過依然用不了多少代碼,可以寫成一個模組專門用做遠端偵錯,import即用。暫未實現,以後有空弄好放代碼出來。

Update: 專用調試模組見《PDB遠端偵錯Python多進程子程式》

最簡單方法遠端偵錯Python多進程子程式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.