多线程popen_python2.7使用subprocess32替代subprocess,避免多线程夯住

本文介绍了在Python2.7中,由于subprocess模块在多线程环境下可能导致线程阻塞的问题,推荐使用subprocess32作为替代方案。subprocess32是python3中相应代码的回退版本,能提高多线程稳定性。此外,还提及了sh模块作为另一种调用外部命令的选择。
摘要由CSDN通过智能技术生成

使用subprocess进行外部命令调用

当我们写python脚本的时候,如果需要调用外部命令,有很多的模板可以使用,标准包里面的os.popen,os.system,commands.getstatusoutput. 但是这些现在都是不推荐的了,现在标准包推荐使用的是subprocess模块. 我一般会使用如下函数来进行封装

def run(cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) out, err = p.communicate() print ('cmd=[{}] out=[{}] err=[{}] returncode=[{}]'.format(cmd, out, err, p.returncode)) if p.returncode != 0: raise Exception('cmd run error') return out
3bd891561b177fefe45c5d0fd0054546.png

这样就可以直接调用run函数来运行命令,在返回码为0(Linux下面被认为是命令执行正确)的情况下,得到命令的标准输出. 在返回码非0(linux下面被认为是命令执行错误)的情况下,直接抛出异常.

这儿抛出异常而不是直接返回其他特殊的值,比如None. 这样可以让脚本在有问题的时候直接退出,而不是让这个错误传递下去.

Linux里面有些特殊的命令,在正常情况下返回码非0,那么自己可以用try,catch把run函数包起来.

使用subprocess32模块来替代subprocess模块

在python2.7中,如果只是在单线程中使用subprocess模板,会发现一切工作正常.但是当在多线程中使用subprocess模块的时候,在某些情况下,一些线程会直接夯住不动.我第一次遇到这个问题排查了特别久.最后google发现是python 2.7中subprocess模块自己的问题.而这个问题在python3中是解决的,google的工程师将python3中的代码backport到python2.7中,创建了subprocess32项目.其pypi链接为https://pypi.org/project/subprocess32/.项目描述中解释了fork和exec之间处理了一些subprocess中没有解决的问题,让整个模板在多线程下工作更加稳定

decb9d9cecef7d629c244f2d8648bcb8.png

使用pip install subprocess32就可以安装.

注意这个包只能在Linux/Unix中使用,Windows中不行.

要使用也比较简单,就是先尝试导入subprocess32为subprocess,如果不成功,那么直接导入subporcess

3654cda36319877564926d128e6a0b72.png

其他选择

大家如果需要在python2.7里面调用外部命令,可以尝试一下sh模块,这个模块和subprocess的使用方法比较不同.

subprocess在加上shell=True的情况下,就相当于在bash里面敲入命令,用起来比较直接.

sh模块通过延迟加载,可以让PATH里面的命令看起来都像是python里面的函数一样被运行,用起来感觉不太一样.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值