对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实现随机密码字典生成器示例
Apr 09 Python
python中的装饰器详解
Apr 13 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
Python三级菜单的实例
Sep 13 Python
python先序遍历二叉树问题
Nov 10 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
11个Python3字典内置方法大全与示例汇总
May 13 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
python计算n的阶乘的方法代码
Oct 25 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
python 实现一个图形界面的汇率计算器
Nov 09 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日期函数date格式化UNIX时间的方法
2015/03/19 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
js中调用微信的扫描二维码功能的实现代码
2020/04/11 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
Python字符遍历的艺术
2008/09/06 Python
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
Python单链表简单实现代码
2016/04/27 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
小结Python的反射机制
2020/09/28 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
美国渔具店:FishUSA
2019/08/07 全球购物
PHP笔试题
2012/02/22 面试题
食堂个人先进事迹
2014/01/22 职场文书
二手房购房协议书范本
2014/10/05 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技