对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读写excel的方法
Nov 18 Python
分析Python的Django框架的运行方式及处理流程
Apr 08 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
Django中Middleware中的函数详解
Jul 18 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
python实现QQ邮箱发送邮件
Mar 06 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
python实现贪吃蛇双人大战
Apr 18 Python
python将dict中的unicode打印成中文实例
May 11 Python
Python语言规范之Pylint的详细用法
Jun 24 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
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
Python中一般处理中文的几种方法
2019/03/06 Python
python实现月食效果实例代码
2019/06/18 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
中学教师岗位职责
2013/11/26 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
规划编制实施方案
2014/03/15 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers