解决大量调用Python subprocess.Popen产生的一些bug

本文介绍了解决使用Python的subprocess.Popen调用大量shell命令时遇到的内存溢出及线程阻塞问题。通过调整参数并清理stdin, stdout, stderr流,作者实现了稳定执行并提供了一个带有超时功能的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自从工作了就好久没发博客,还是出来冒个泡=。= 
前段时间写的一个项目需要用python的subprocess.Popen大量调用某shell命令,运行到一定量级之后就会产生内存溢出,造成大量线程阻塞,然后就会造成([Errno 24] Too many open files)这个异常。 
网上有人说是close_fds=True这个参数在python2.x默认没打开,这个参数可以关闭文件描述符,试了没有作用。 
后来在国外某个人的帖子找到了和我类似的问题,解决办法就是执行后把stdin,stdout,stderr3个流进行清空即可。 
结合网上的资料,写了一个可以自定义超时时间调用subprocess.Popen执行shell命令的函数(自定义超时为了避免某些shell卡死的情况),用这个函数去调用subprocess.Popen就不会产生上面这些问题了。

def timeout_command(command, timeout):
	start = datetime.datetime.now()
	process = subprocess.Popen(command, bufsize=10000, stdout=subprocess.PIPE, close_fds=True)
	while process.poll() is None:
		time.sleep(0.1)
		now = datetime.datetime.now()
		if (now - start).seconds> timeout:
		try:
			process.terminate()
		except Exception,e:
			return None
		return None
	out = process.communicate()[0]
	if process.stdin:
		process.stdin.close()
	if process.stdout:
		process.stdout.close()
	if process.stderr:
		process.stderr.close()
	try:
		process.kill()
	except OSError:
		pass
	return out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值