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获取糗百图片代码实例
Dec 18 Python
Python中的rjust()方法使用详解
May 19 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
Python判断Abundant Number的方法
Jun 15 Python
批处理与python代码混合编程的方法
May 19 Python
解决Python2.7读写文件中的中文乱码问题
Apr 12 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
python join方法使用详解
Jul 30 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
Python面向对象之内置函数相关知识总结
Jun 24 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
解析php中curl_multi的应用
2013/07/17 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
Python 装饰器深入理解
2017/03/16 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
JDO的含义
2012/11/17 面试题
毕业生物理教师求职信
2013/10/17 职场文书
生产现场工艺工程师岗位职责
2013/11/28 职场文书
竞聘演讲稿
2014/04/24 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
祝寿主持词
2015/07/02 职场文书
防震减灾主题班会
2015/08/14 职场文书
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL