对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单元测试框架unittest简明使用实例
Apr 13 Python
Python随机生成数模块random使用实例
Apr 13 Python
python递归删除指定目录及其所有内容的方法
Jan 13 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
Dec 21 Python
python实现kmp算法的实例代码
Apr 03 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
Jun 27 Python
django fernet fields字段加密实践详解
Aug 12 Python
python使用sessions模拟登录淘宝的方式
Aug 16 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 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
如何用PHP实现插入排序?
2013/04/10 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
python实现基本进制转换的方法
2015/07/11 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
django query模块
2019/04/20 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
经典C++面试题一
2016/11/06 面试题
50道外企软件测试面试题
2014/08/18 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
本科生职业生涯规划书范文
2014/01/21 职场文书
个人综合鉴定材料
2014/05/23 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
五心教育心得体会
2014/09/04 职场文书
公司业务员管理制度
2015/08/05 职场文书