对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包抓取并保存网页源码的方法
Mar 15 Python
Python读大数据txt
Mar 28 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
python实现音乐下载的统计
Jun 20 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 Python
python3的UnicodeDecodeError解决方法
Dec 20 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
python 项目目录结构设置
Feb 14 Python
Python网页解析器使用实例详解
May 30 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 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
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
简单实现php上传文件功能
2017/09/21 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
详解python时间模块中的datetime模块
2016/01/13 Python
python增加图像对比度的方法
2019/07/12 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
详解Python流程控制语句
2020/10/28 Python
python中常用的数据结构介绍
2021/01/12 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
如何掌握自荐信格式呢
2013/11/19 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
实习工作表现评语
2014/12/31 职场文书
何玥事迹观后感
2015/06/16 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
用Python创建简易网站图文教程
2021/06/11 Python
mysql联合索引的使用规则
2021/06/23 MySQL