如何在 Python 中的子进程管道上执行非阻塞读取
在 Python 中使用子进程模块时,可能有必要对子进程的输出流执行非阻塞读取。这可以确保程序在从可能没有任何可用数据的进程中读取数据时不会阻塞。
传统阻塞读取
通常,以下代码将是用于读取子进程的标准输出:
p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE) output_str = p.stdout.readline()
但是,这种方法会阻塞程序的执行直到标准输出上有数据可用。
非阻塞读取
要实现非阻塞读取,一种常见的方法是使用 Python 中的 Queue 类队列模块。下面是一个例子:
import sys from subprocess import PIPE, Popen from threading import Thread try: from queue import Queue, Empty except ImportError: from Queue import Queue, Empty # python 2.x ON_POSIX = 'posix' in sys.builtin_module_names def enqueue_output(out, queue): for line in iter(out.readline, b''): queue.put(line) out.close() p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX) q = Queue() t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True # thread dies with the program t.start() # ... do other things here # read line without blocking try: line = q.get_nowait() # or q.get(timeout=.1) except Empty: print('no output yet') else: # got line # ... do something with line
在这段代码中,enqueue_output函数在一个单独的线程中运行,并不断地从子进程stdout队列中终止输出。主线程可以随时调用q.get_nowait()来检查队列中是否有数据。如果没有数据,将引发 Empty 异常,而如果成功,将返回获取的行。
以上是如何在Python中实现非阻塞子进程管道读取?的详细内容。更多信息请关注PHP中文网其他相关文章!