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中文网其他相关文章!