首页 > 后端开发 > Python教程 > 如何在Python中实现非阻塞子进程管道读取?

如何在Python中实现非阻塞子进程管道读取?

Linda Hamilton
发布: 2024-12-17 05:30:25
原创
969 人浏览过

How to Achieve Non-Blocking Subprocess Pipe Reads in Python?

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

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