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 相关文章推荐
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
python中global用法实例分析
Apr 30 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
Python Socket传输文件示例
Jan 16 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
python中的字符串内部换行方法
Jul 19 Python
django 连接数据库 sqlite的例子
Aug 14 Python
python如何判断IP地址合法性
Apr 05 Python
Python中的xlrd模块使用原理解析
May 21 Python
用opencv给图片换背景色的示例代码
Jul 08 Python
pytorch训练神经网络爆内存的解决方案
May 22 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
php常用表单验证类用法实例
2015/06/18 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
Python实现截屏的函数
2015/07/26 Python
python 排序算法总结及实例详解
2016/09/28 Python
python matplotlib拟合直线的实现
2019/11/19 Python
python 实现Harris角点检测算法
2020/12/11 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
中学生团员自我评价分享
2013/12/07 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
人力资源作业细则
2014/03/03 职场文书
信息技术课后反思
2014/04/27 职场文书
市场开发计划书
2014/05/07 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
英语教师求职信范文
2015/03/20 职场文书
大客户经理岗位职责
2015/04/09 职场文书
公司停电通知
2015/04/15 职场文书
丧事主持词
2015/07/02 职场文书
Python装饰器的练习题
2021/11/23 Python
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA