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 相关文章推荐
10款最好的Web开发的 Python 框架
Mar 18 Python
python通过post提交数据的方法
May 06 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
Python分支结构(switch)操作简介
Jan 17 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 Python
超级详细实用的pycharm常用快捷键
May 12 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与MySQL交互使用详解
2006/10/09 PHP
PHP 开源AJAX框架14种
2009/08/24 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
python算法学习之基数排序实例
2013/12/18 Python
python处理二进制数据的方法
2015/06/03 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Python实现图片拼接的代码
2018/07/02 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers