博客
关于我
Python:如何以非阻塞方式读取子进程的标准输出
阅读量:796 次
发布时间:2023-03-08

本文共 1395 字,大约阅读时间需要 4 分钟。

Python非阻塞读取子进程输出的方法及示例

在Python编程中,当我们需要启动一个子进程并实时读取其输出时,非阻塞读取是非常有用的功能。这种方法可以避免主程序长时间等待子进程完成,从而实现更高效的资源利用。以下将详细介绍如何在Python中实现非阻塞读取子进程的标准输出。

首先,我们需要使用subprocess.Popen来启动子进程,并将其标准输出(stdout)重定向到我们的程序中。通过将stdout参数设置为subprocess.PIPE,我们可以将子进程的输出获取到主程序中。此外,我们还需要指定stderr=subprocess.STDOUT,以便将子进程的标准错误也重定向到标准输出流中,这样可以简化读取操作。

为了实现非阻塞读取,我们可以利用asyncio库。asyncio库提供了异步编程模型,可以帮助我们在不阻塞主线程的情况下进行I/O操作。具体来说,我们可以使用asyncio.create_subprocess_shell函数来启动子进程,并通过proc.stdout.readline进行非阻塞读取。

以下是一个简单的代码示例:

import asyncioimport subprocess# 启动子进程proc = await asyncio.create_subprocess_shell(    'echo hello world',    stdout=subprocess.PIPE,    stderr=subprocess.STDOUT)# 非阻塞读取子进程的输出while True:    line = await proc.stdout.readline()    if not line:        break    print('[stdout]', line.decode().strip())# 等待子进程结束await proc.wait()

在这个代码中,asyncio.create_subprocess_shell用于启动一个新的子进程,执行echo hello world命令。stdout=subprocess.PIPE和stderr=subprocess.STDOUT选项告诉我们将子进程的标准输出和错误输出都重定向到proc.stdout中。

随后,通过一个无限循环,我们使用proc.stdout.readline()非阻塞地读取子进程的输出。如果readline()返回一个空bytes对象,说明子进程已经结束,我们就可以退出循环。此时,我们可以将读取到的输出内容解码并打印出来。

最后,使用await proc.wait()等待子进程完成,这样可以确保子进程结束后主程序不会立即退出。

这种方法非常适用于需要实时监控子进程输出的场景。例如,在机器学习训练过程中,可以用这样的方式实时获取模型的训练日志并进行更新。或者,在数据处理任务中,可以实时查看进度信息,提升用户体验。

需要注意的是,在实际应用中,可能需要处理更多的边界条件和异常情况。例如,如何处理子进程的错误输出,如何处理子进程意外终止等。建议在实际项目中根据具体需求进行适当的修改和优化。

总之,通过结合subprocess和asyncio库,我们可以轻松地实现Python程序中非阻塞读取子进程标准输出的功能,从而提升程序的性能和用户体验。

转载地址:http://ydlfk.baihongyu.com/

你可能感兴趣的文章
python-文件操作
查看>>
PYTHON-模块 sys os random shutil-练习
查看>>
Python-模块与包的管理
查看>>
PYTHON-模块定义 搜索路径
查看>>
Python-爬虫工程师-面试总结
查看>>
Python-类与文件读取结合
查看>>
python-类思想-实现简单增删查改
查看>>
python-网络编程
查看>>
python写入文件出现空行
查看>>
PYTHON-返回给定x的多边形路径的y坐标
查看>>
python-进程池与线程池,协程
查看>>
Python-通过函数传递变量
查看>>
Python内置函数详解——总结篇
查看>>
Python.对象集合中的标识.和散列
查看>>
Python.硒.拖放错误“AttributeError:move_to 需要 WebElement“
查看>>
Python内置函数详解
查看>>
Python/Kivy:从一个类调用函数到另一个类并在 Python 中显示小部件
查看>>
Python/Kivy:我可以在双击标签时调用函数吗
查看>>
python内置函数5-frozenset()
查看>>
Python/Plotly:如何使用要显示的信息自定义悬停模板?
查看>>