对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功能键的读取方法
May 28 Python
Python正则表达式使用范例分享
Dec 04 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
Python实现把类当做字典来访问
Dec 16 Python
基于pandas中expand的作用详解
Dec 17 Python
python内置模块collections知识点总结
Dec 19 Python
python字符串的index和find的区别详解
Jun 20 Python
python实现AdaBoost算法的示例
Oct 03 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 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&&mysql)六
2006/10/09 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
PHP编写RESTful接口
2016/02/23 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
js a标签点击事件
2017/03/30 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
python设置windows桌面壁纸的实现代码
2013/01/28 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
关于反爬虫的一些简单总结
2017/12/13 Python
python logging添加filter教程
2019/12/24 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
美术师范毕业生自荐信
2013/11/16 职场文书
环保倡议书怎么写
2014/05/16 职场文书
商场租赁意向书
2014/07/30 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏