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

 更新时间:2019年08月14日 13:37:31   作者:tinyid  
今天小编就为大家分享一篇Python 从subprocess运行的子进程中实时获取输出的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

有些时候,我们需要将某些程序放到子进程中去运行,以达到整合系统的目的。在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之np.where()如何替换缺失值

    Python之np.where()如何替换缺失值

    这篇文章主要介绍了Python中的np.where()如何替换缺失值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python可视化Matplotlib折线图plot用法详解

    Python可视化Matplotlib折线图plot用法详解

    这篇文章主要为大家介绍了Python可视化中Matplotlib折线图plot用法的详解,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家多多进步
    2021-09-09
  • python+opencv图像分割实现分割不规则ROI区域方法汇总

    python+opencv图像分割实现分割不规则ROI区域方法汇总

    这篇文章主要介绍了python+opencv图像分割实现分割不规则ROI区域方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python用正则表达式实现爬取古诗文网站信息

    Python用正则表达式实现爬取古诗文网站信息

    这篇文章主要给大家介绍了关于Python如何利用正则表达式爬取爬取古诗文网站信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • python通过实例讲解反射机制

    python通过实例讲解反射机制

    这篇文章主要介绍了python通过实例讲解反射机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Python利用pdfplumber实现读取PDF写入Excel

    Python利用pdfplumber实现读取PDF写入Excel

    pdfplumber专注PDF内容提取,例如文本(位置、字体及颜色等)和形状(矩形、直线、曲线),还有解析表格的功能。本文主要为大家介绍如何利用pdfplumber实现读取PDF写入Excel,需要的可以参考一下
    2022-06-06
  • 从多个tfrecord文件中无限读取文件的例子

    从多个tfrecord文件中无限读取文件的例子

    今天小编就为大家分享一篇从多个tfrecord文件中无限读取文件的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 解决win64 Python下安装PIL出错问题(图解)

    解决win64 Python下安装PIL出错问题(图解)

    这篇文章主要介绍了解决win64 Python下安装PIL出错问题,文中的解决方法也很简单,需要的朋友参考下吧
    2018-09-09
  • 一文带你理解Python中面向对象编程OOP的概念

    一文带你理解Python中面向对象编程OOP的概念

    在Python中,面向对象编程(OOP)是一种在编程中使用对象和类的编程范式,它旨在实现现实世界的实体,下面我们就一起来看看它的相关知识吧
    2023-08-08
  • 详解python中的time和datetime的常用方法

    详解python中的time和datetime的常用方法

    Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。这篇文章主要介绍了python之time和datetime的常用方法 ,需要的朋友可以参考下
    2019-07-07

最新评论