在Python中,可以使用subprocess.Popen
对象来实现非阻塞读取子进程的输出。通过设置stdout
参数为subprocess.PIPE
,可以将子进程的标准输出重定向到管道中,然后使用select
模块来检查管道是否有数据可读,从而实现非阻塞读取。
以下是一个示例代码:
import subprocess
import select
# 启动子进程并将其标准输出重定向到管道
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
# 读取子进程输出
while True:
# 使用select模块检查管道是否有数据可读
rlist, _, _ = select.select([process.stdout], [], [], 0.1)
if process.stdout in rlist:
data = process.stdout.read(1024)
if not data:
break
print(data.decode('utf-8'))
# 等待子进程结束
process.wait()
在上面的示例中,我们启动了一个ls -l
的子进程,并将其标准输出重定向到管道中。然后在一个循环中使用select
模块来检查管道是否有数据可读,如果有数据可读,则读取并打印输出。
需要注意的是,在读取完所有输出后,需要调用process.wait()
来等待子进程结束。