对Python subprocess.Popen子进程管道阻塞详解


Posted in Python onOctober 29, 2018

问题产生描述

使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理。

出问题的代码

# 启用子进程执行外部shell命令
def __subprocess(self,cmd):
 try:
 # 执行外部shell命令, 输出结果输出管道
 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
 p.wait()

 # 从标准输出读出shell命令的输出结果
 #rt = p.stdout.read().decode()

 # 以换行符拆分数据,并去掉换行符号存入列表
 rt_list = rt.strip().split('\n')

 except Exception as e:
 if(DEBUG):
  print(traceback.format_exc())

 return rt_list

问题分析

子进程产生一些数据,他们会被buffer起来,当buffer满了,会写到子进程的标准输出和标准错误输出,这些东西通过管道发送给父进程。当管道满了之后,子进程就停止写入,于是就卡住了,及时取走管道的输出就不会出现阻塞了

但是本人此处采取的是临时文件接收子进程输出,由于临时文件是建立在磁盘上的,没有size的限制,并且文件被close后,相应的磁盘上的空间也会被释放掉。

已改进的代码

import tempfile
# 启用子进程执行外部shell命令
def __subprocess(self,cmd):
 try:
 # 得到一个临时文件对象, 调用close后,此文件从磁盘删除
 out_temp = tempfile.TemporaryFile(mode='w+')
 # 获取临时文件的文件号
 fileno = out_temp.fileno()

 # 执行外部shell命令, 输出结果存入临时文件中
 p = subprocess.Popen(cmd, shell=True, stdout=fileno, stderr=fileno) 
 p.wait()

 # 从临时文件读出shell命令的输出结果
 out_temp.seek(0)
 rt = out_temp.read()

 # 以换行符拆分数据,并去掉换行符号存入列表
 rt_list = rt.strip().split('\n')

 except Exception as e:
 if(DEBUG):
  print(traceback.format_exc())

 finally:
 if out_temp:
  out_temp.close()

 return rt_list

以上这篇对Python subprocess.Popen子进程管道阻塞详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现百度语音识别api
Apr 10 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
python实现银联支付和支付宝支付接入
May 07 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
python实现多线程端口扫描
Aug 31 Python
基于Python获取docx/doc文件内容代码解析
Feb 17 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
Python中Permission denied的解决方案
Apr 02 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 #Python
pycharm 配置远程解释器的方法
Oct 28 #Python
解决每次打开pycharm直接进入项目的问题
Oct 28 #Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 #Python
解决python opencv无法显示图片的问题
Oct 28 #Python
pycharm中成功运行图片的配置教程
Oct 28 #Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 #Python
You might like
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php学习之数据类型之间的转换代码
2011/05/29 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
Python正则表达式学习小例子
2020/03/03 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
英国现代绅士品牌:Hackett
2017/12/17 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
普通院校学生的自荐信
2013/11/27 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
职业规划实施方案
2014/06/10 职场文书
小学社团活动总结
2014/06/27 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android