对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 相关文章推荐
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
Python零基础入门学习之输入与输出
Apr 03 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
ubuntu上安装python的实例方法
Sep 30 Python
python框架flask表单实现详解
Nov 04 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
Python如何对齐字符串
Jul 30 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
详解Selenium 元素定位和WebDriver常用方法
Dec 04 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扩展开发经验分享
2012/09/06 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
玩转python爬虫之正则表达式
2016/02/17 Python
使用python实现tcp自动重连
2017/07/02 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
python3多线程知识点总结
2019/09/26 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
tensorflow自定义激活函数实例
2020/02/04 Python
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
财务部副经理岗位职责
2014/03/14 职场文书
预备党员承诺书
2014/03/25 职场文书
大学生社会实践方案
2014/05/11 职场文书
应聘教师求职信范文
2015/03/20 职场文书
2016年五一促销广告语
2016/01/28 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Python实现简单得递归下降Parser
2022/05/02 Python
介绍一下28个JS常用数组方法
2022/05/06 Javascript