对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 07 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
python读写ini配置文件方法实例分析
Jun 30 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
浅析Python数据处理
May 02 Python
python for 循环获取index索引的方法
Feb 01 Python
基于python的ini配置文件操作工具类
Apr 24 Python
python爬虫 execjs安装配置及使用
Jul 30 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
通过cmd进入python的步骤
Jun 16 Python
Python字典dict常用方法函数实例
Nov 09 Python
python抢购软件/插件/脚本附完整源码
Mar 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
Laravel 5框架学习之表单
2015/04/08 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
Python分支语句与循环语句应用实例分析
2019/05/07 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
django实现模型字段动态choice的操作
2020/04/01 Python
pycharm的python_stubs问题
2020/04/08 Python
python tqdm库的使用
2020/11/30 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
教师找工作推荐信
2013/11/23 职场文书
地质灾害防治方案
2014/05/14 职场文书
参赛口号
2014/06/16 职场文书
火箭队口号
2014/06/18 职场文书
纪律教育月活动总结
2014/08/26 职场文书
欢迎词怎么写
2015/01/23 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技