使用Subprocess Popen的类库困挠了我一个月的问题终于解决了。
一句话就是:等待命令返回不要使用wait(),而是使用communicate(),但注意内存,大输出使用文件。
错误的使用例子
之前的代码这样使用的。
# 不合适的代码
def run_it(self, cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True,
stderr=subprocess.PIPE, close_fds=True)
log.debug('running:%s' % cmd)
p.wait()
if p.returncode != 0:
log.critical("Non zero exit code:%s executing: %s" % (p.returncode, cmd))
return p.stdout
这段代码之前用着一直没有问题的,后来不知道为何就不能用了(后面知道了,原来输出内容增加,输出的问题本太长,把管道给堵塞了)。
这样的代码也在之前的一个项目中使用,而且调用的次数有上亿次,也没什么问题。之前倒是也卡住了一次,不过有个大神把问题找到了,因为Python版本低于2.7.6,Python对close_fds的一些实现不太好导致的,没有把管道释放掉,一直卡住。设置close_fds=True。不过这个并没有解决我的问题。
解决了我的问题
当时想着既然卡住了,那我就看看是输出了什么才卡住的,结果现有的代码无法