python subprocess使用记录
生活随笔
收集整理的這篇文章主要介紹了
python subprocess使用记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
前幾天發現服務器上有幾個zombie進程,搜索了一下(ps -ef | grep defunct),僵尸進程的父進程是以前寫的python同步腳本。
仔細看了下代碼,發現在這:
sub?=?subprocess.Popen(cmd,?shell=True,?stdout=subprocess.PIPE,?stderr=subprocess.STDOUT) #?other?codes對,父進程開啟了子進程后,并無任何動作,子進程執行完成后成為一個僵尸進程。
解決方法很簡單,父進程wait子進程即可,但因為標準輸出和標準錯誤輸出是管道方式(PIPE),直接使用wait()有可能會導致管道堵塞,python官方文檔亦有以下敘述:
WarningThis?will?deadlock?when?using?stdout=PIPE?and/or?stderr=PIPE?and?the?child?process?generates?enough?output?to?a?pipe?such?that?it?blocks?waiting?for?the?OS?pipe?buffer?to?accept?more?data.?Use?communicate()?to?avoid?that.官方建議適用communicate方法,于是修改代碼如下:
另外一種修改方式,適用于不關心子進程返回結果的場景,可以將STDOUT和STDERR輸出結果定向到/dev/dull去,再調用wait()即可,如下:
因為需要子進程的處理信息,選用了第一種方法。重新啟動python腳本,不再出現僵尸進程的問題了。
轉載于:https://my.oschina.net/catandpaperball/blog/477184
總結
以上是生活随笔為你收集整理的python subprocess使用记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows2003 DNS服务器配置
- 下一篇: html5 css3中的一些笔记