对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类的多重继承问题深入分析
Nov 09 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
python 写的一个爬虫程序源码
Feb 28 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
基于Python闭包及其作用域详解
Aug 28 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Python中Numpy ndarray的使用详解
May 24 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
python利用pandas分析学生期末成绩实例代码
Jul 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php 中include()与require()的对比
2006/10/09 PHP
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
php读取csc文件并输出
2015/05/21 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
python的变量与赋值详细分析
2017/11/08 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
Python远程linux执行命令实现
2020/11/11 Python
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
幼儿如何来做好自我评价
2013/11/05 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
师德师风承诺书
2014/05/23 职场文书