首页 > 后端开发 > Python教程 > 如何在 Python 中从子进程的输出流执行非阻塞读取?

如何在 Python 中从子进程的输出流执行非阻塞读取?

DDD
发布: 2024-12-17 22:06:12
原创
181 人浏览过

How Can I Perform Non-Blocking Reads from a Subprocess's Output Stream in Python?

Python 中子进程输出流的非阻塞读取

在 Python 中,subprocess 模块提供了一种便捷的方式来启动并与外部交互流程。然而,高效处理父进程和子进程之间的 I/O 交互至关重要。

考虑以下场景:您希望对子进程的标准输出流执行非阻塞读取。默认情况下,p.stdout.readline() 会阻塞,直到缓冲区中的数据可用。为了解决这个问题,我们可以采用一种涉及单独线程和队列的技术。

首先,创建一个队列来存储输出行:

from Queue import Queue
登录后复制

接下来,启动一个线程来读取来自子进程标准输出的行并将它们排入队列:

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()
登录后复制

初始化子进程并启动thread:

p = Popen(['myprogram.exe'], stdout=PIPE)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True
t.start()
登录后复制

要非阻塞读取一行,请使用以下方法:

try:
    line = q.get_nowait()  # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else:  # got line
    # do something with the line
登录后复制

此方法跨平台兼容,并确保非阻塞读取,让您高效处理来自子进程的数据。

以上是如何在 Python 中从子进程的输出流执行非阻塞读取?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板