【发布时间】:2011-09-19 07:18:09
【问题描述】:
我正在使用pty 读取非阻塞进程的标准输出,如下所示:
import os
import pty
import subprocess
master, slave = pty.openpty()
p = subprocess.Popen(cmd, stdout = slave)
stdout = os.fdopen(master)
while True:
if p.poll() != None:
break
print stdout.readline()
stdout.close()
除了while-loop 偶尔会阻塞之外,一切正常。这是因为print stdout.readline() 行正在等待从stdout 读取某些内容。但是如果程序已经终止,我上面的小脚本就会永远挂起。
我的问题是:有没有办法窥视stdout 对象并检查是否有数据可供读取?如果不是这种情况,它应该继续通过while-loop,它会发现进程实际上已经终止并中断循环。
【问题讨论】:
-
只是一个想法,不知道这是否有效,但是:也许您可以检查
stdout.seek(1, os.SEEK_CUR)是否抛出异常并确定是否有可用数据? -
@cularis
stdout.seek(1, os.SEEK_CUR)抛出此异常:IOError: [Errno 29] Illegal seek -
一般评论:使用
p.poll() is not None(对象身份检查)而不是p.poll() != None(相等性检查,不太精确且速度较慢)。 -
虽然你的循环偶尔会阻塞,但它不应该无限期挂起,因为正在关闭的文件被认为可以被轮询读取。
-
type(p) is subprocess.Popendoc forsubprocess.Popen.poll()是“检查子进程是否已终止。返回返回码属性。”
标签: python stdout popen pty peek