近來用Python的unittest框架來做一個(gè)regression test 工具,驗(yàn)證一些復(fù)雜的程序功能,期望做到自動(dòng)化測(cè)試完成一部分需要繁瑣的界面點(diǎn)擊和等待才能完成的驗(yàn)證工作。
其中核心的部分是通過python的subproces module中的Popen來調(diào)用shell腳步完成功能性請(qǐng)求,并抓取執(zhí)行的結(jié)果。
初一開始,test case比較少的時(shí)候(100個(gè)以內(nèi))都沒有任何問題;但從某一刻起,當(dāng)超過120個(gè)的時(shí)候,最后一個(gè)test case執(zhí)行的時(shí)候,總是報(bào)告
OSError: too many open files
給出的stack trace指向了Popen的communicate方法。
最簡(jiǎn)單的懷疑自然是打開文件數(shù)的限制了, ulimit -a 發(fā)現(xiàn)默認(rèn)的Shell的確只有256,雖然感覺應(yīng)該也夠用了(因?yàn)槊恳粋€(gè)case都是用單獨(dú)的Popen來執(zhí)行操作,完畢就應(yīng)該被回收了),但還是自然將其開大一些;
ulimit –n 1024
重新執(zhí)行,還是最后一個(gè)case失敗,錯(cuò)誤依然。
Google了一下,暫時(shí)沒有頭緒,只有待有時(shí)間再詳細(xì)盤查一下原委了。不過在搜索答案的過程中發(fā)現(xiàn)了一個(gè)有意思的現(xiàn)象:
有人在詢問怎樣將python的字符串quote成為一個(gè)可以再shell中安全使用的字符串,就有人回復(fù)說Subprocess中有一個(gè)類似的方法可以完成類似的工作為什么不用;馬上有牛人站出來說,這個(gè)模塊的作者大概不想維護(hù)過多的東西,因而將其隱藏了起來,而不是放開了給大家用,因?yàn)樗膁oc里邊都沒有直接說明,用的人是看了他的代碼才知道有這個(gè)函數(shù)(參考這里)