对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中__init__和__new__的区别详解
Jul 09 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
Python创建xml文件示例
Mar 22 Python
Golang与python线程详解及简单实例
Apr 27 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
python实现两个文件合并功能
Apr 01 Python
python基础教程项目三之万能的XML
Apr 02 Python
python多维数组切片方法
Apr 13 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
python实现图片九宫格分割的示例
Apr 25 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获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
prototype Element学习笔记(篇一)
2008/10/26 Javascript
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
python读写文件操作示例程序
2013/12/02 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
Python定时器实例代码
2017/11/01 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
django 实现简单的插入视频
2020/04/07 Python
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
小学生家长评语集锦
2014/01/30 职场文书
ktv好的活动方案
2014/08/17 职场文书
导游词之唐山景点
2019/12/18 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL