近来用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里边都没有直接说明,用的人是看了他的代码才知道有这个函数(参考这里)