Python 从subprocess运行的子进程中实时获取输出的例子


Posted in Python onAugust 14, 2019

有些时候,我们需要将某些程序放到子进程中去运行,以达到整合系统的目的。在Python中,一个非常好的选择就是使用subprocess模块,本模块为开辟子进程去执行子程序提供了统一的接口,更加便于学习和使用。

同时,对于在子进程里的程序,我们希望能够实时获取其输出,以在主进程中打印相关信息,使我们能够了解当前子程序的执行进度。对此,subprocess模块也提供了相应的参数,能够将子程序的标准输出和标准错误输出返回给主程序。

下面,我们就通过一个例子来说明这个功能。首先,我们需要一个用于模拟标准输出和标准错误输出的“子程序”——subprogram.py:

import sys
import time
 
 
for i in range(5):
  sys.stdout.write('Processing {}\n'.format(i))
  time.sleep(1)
 
for i in range(5):
  sys.stderr.write('Error {}\n'.format(i))
  time.sleep(1)

可以看到这个程序非常简单,分别向标准输出和标准错误写入了5条信息,并且输出之间有1秒的间隔。下面是驱动这个“子程序”运行的“主程序”——main.py:

import shlex
import subprocess
 
if __name__ == '__main__':
  shell_cmd = 'python3 subprogram.py'
  cmd = shlex.split(shell_cmd)
  p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  while p.poll() is None:
    line = p.stdout.readline()
    line = line.strip()
    if line:
      print('Subprogram output: [{}]'.format(line))
  if p.returncode == 0:
    print('Subprogram success')
  else:
    print('Subprogram failed')

可以看到,我们通过指定stderr=subprocess.STDOUT,将子程序的标准错误输出重定向到了标准输出,以使我们可以直接从标准输出中同时获取标准输出和标准错误的信息。运行这个程序,我们会期待main.py会每秒输出一次信息到控制台,但是事实上,我们直到等了10秒之后才一次性看到所有的10条输出。

产生这种现象的原因也非常简单,就是标准输出和标准错误有一个缓存的概念,它不会立即将程序的标准输出内容返回,而是会做一定的缓存,直到缓存满或者程序结束强制清空缓存时才输出。了解到问题的原因,解决问题的方法也就一目了然了,我们只需要在子程序中,每次输出后去手动清空一下缓存即可,以下是修改过的subprogram.py:

import sys
import time
 
 
for i in range(5):
  sys.stdout.write('Processing {}\n'.format(i))
  sys.stdout.flush()
  time.sleep(1)
 
for i in range(5):
  sys.stderr.write('Error {}\n'.format(i))
  sys.stderr.flush()
  time.sleep(1)

经过上述的修改之后,再次运行main.py程序,我们会看到,每秒会输出一条信息,达到了我们在主程序中,去追踪子程序执行过程的目的。

PS:测试环境是Python3.6.1 Mac版。

以上这篇Python 从subprocess运行的子进程中实时获取输出的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单分析Python中用fork()函数生成的子进程
May 04 Python
Python的Django框架安装全攻略
Jul 15 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
python模仿网页版微信发送消息功能
Feb 24 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
Python正则表达式指南 推荐
Oct 09 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
python执行精确的小数计算方法
Jan 21 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
基于python纯函数实现井字棋游戏
May 27 Python
利用python做数据拟合详情
Nov 17 Python
python3调用windows dos命令的例子
Aug 14 #Python
python脚本执行CMD命令并返回结果的例子
Aug 14 #Python
用Python调用win命令行提高工作效率的实例
Aug 14 #Python
python基础教程之while循环
Aug 14 #Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 #Python
Python学习笔记之Break和Continue用法分析
Aug 14 #Python
Python学习笔记之While循环用法分析
Aug 14 #Python
You might like
解析php中如何调用用户自定义函数
2013/08/06 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
大一学生的职业生涯规划书范文
2014/01/19 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
连锁超市项目计划书
2014/09/15 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
2015年教学工作总结
2015/04/02 职场文书
行政处罚决定书
2015/06/24 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js