对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实现字典的key和values的交换
Aug 04 Python
浅谈Python 对象内存占用
Jul 15 Python
Python序列操作之进阶篇
Dec 08 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
python编程嵌套函数实例代码
Feb 11 Python
Pyspider中给爬虫伪造随机请求头的实例
May 07 Python
通过Pandas读取大文件的实例
Jun 07 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
python实现梯度下降法
Mar 24 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 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 代码优化的42条建议 推荐
2009/09/25 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
YII框架http缓存操作示例
2019/04/29 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
jQuery插件开发全解析
2012/10/10 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
使用Python的PIL模块来进行图片对比
2016/02/18 Python
Python中super()函数简介及用法分享
2016/07/11 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
python sqlite的Row对象操作示例
2019/09/11 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
几个常见的软件测试问题
2016/09/07 面试题
写自荐信的七个技巧
2013/10/15 职场文书
教师自荐信范文
2013/12/09 职场文书
初中生期末考试的自我评价
2013/12/17 职场文书
2014年应届大学生自我评价
2014/01/09 职场文书
超市开店计划书
2014/04/26 职场文书
求职导师推荐信范文
2015/03/27 职场文书
Node.js实现断点续传
2021/06/23 Javascript