当前位置: 首页 > news >正文

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

使用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里面的函数一样被运行,用起来感觉不太一样.

相关文章:

  • 构造哈希表的三个主要工作_挖掘机 斗杆再生阀内阀芯工作原理、主要阀体构造,工作原理、出现故障分析原因,挖机动臂无力,做工缓慢时的故障原因...
  • php mysql 日期格式化_[php基础]Mysql日期函数:日期时间格式转换函数详解
  • spring dbcp mysql_spring与Dbcp
  • mysql 存储引擎 对比_MySQL存储引擎(附带各种存储引擎的对比)
  • GCC精彩之旅 [zz]
  • mysql 57授权失败_完美解决mysql客户端授权后连接失败的问题
  • python显示括号错误_【求救】python中处理错误值时总是提示missing),但实际括号都是英文,也没有缺失括号,求救!!!...
  • QQ 1234days
  • new操作符的使用问题[ask in smth]
  • python王者战斗_用 Python 自动玩王者荣耀,简直不要太秀!
  • 大家在申请内存时都是如何做的?[ask in smth]
  • 单例模式获取mysql连接_获取JDBC Connection单例模式
  • centos7安装源mysql5.6_centos7.4 mysql5.6 源码安装
  • 系统安装时文件系统的选择
  • python super 多重继承_Python的super()如何处理多重继承?
  • 「面试题」如何实现一个圣杯布局?
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • iOS编译提示和导航提示
  • Java程序员幽默爆笑锦集
  • JSONP原理
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 初识MongoDB分片
  • 从PHP迁移至Golang - 基础篇
  • 力扣(LeetCode)965
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (09)Hive——CTE 公共表达式
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (转)JAVA中的堆栈
  • (转)memcache、redis缓存
  • (转)详解PHP处理密码的几种方式
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net core 6 集成和使用 mongodb
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 使窗口永不获得焦点
  • .NetCore项目nginx发布
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [BUUCTF]-Reverse:reverse3解析
  • [C++] new和delete
  • [cogs2652]秘术「天文密葬法」
  • [C语言]——C语言常见概念(1)
  • [Flexbox] Using order to rearrange flexbox children
  • [NISACTF 2022]easyssrf
  • [PyQt] 使用.qrc 生成资源文件供程序中使用
  • [pytorch入门] 2. tensorboard
  • [RoarCTF 2019]PHPShe
  • [SHELL]shell scripts笔记(1)