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