在Python中,如何最好地读取子代和孙代的行,包括最后一行不完整的行?

在Python中,如何最好地读取子代和孙代的行,包括最后一行不完整的行?,python,Python,在Python中,我可以生成一个子项并获取其输出的文件描述符,如下所示: pid, out = pty.fork() if pid: 现在我想从子输出中读取行,直到它消失,我可以使用非阻塞的waitpidpid进行检查 我想这样做: f = os.fdopen(out) 现在呢 for line in f: 或 但这里至少有两个问题: 1.假设孩子在发出最后一行时死亡。现在for和readline将抛出一个异常,如何从异常处理程序内部读取不完整的行 如果孩子生了一个孙子,然

在Python中,我可以生成一个子项并获取其输出的文件描述符,如下所示:

pid, out = pty.fork()
if pid:
现在我想从子输出中读取行,直到它消失,我可以使用非阻塞的waitpidpid进行检查

我想这样做:

    f = os.fdopen(out)
现在呢

    for line in f:

但这里至少有两个问题: 1.假设孩子在发出最后一行时死亡。现在for和readline将抛出一个异常,如何从异常处理程序内部读取不完整的行

如果孩子生了一个孙子,然后死了,那么for和readline会立即抛出一个异常。我想等待孙辈的输出。 另一种选择是

    while True:
        (rSet, _, _) = select.select([out], [], [], <some seconds>)
        if rSet:
            buf = os.read(out, <some length>)
            if buf:
                #process it, assembling lines
            else:
                #check if child dead, if so, bail out
但这相当麻烦,需要我自己费力地组装生产线

这是最好的方法,还是有更好的方法?

来自:

如果f.readline返回空字符串,则表示已到达文件末尾,而空行由“\n”表示,该字符串仅包含一个换行符


我相信来自子进程的管道将被关闭,当您试图读取它时,您将得到一个IOError


编辑后再编辑:操作系统会在管道中缓冲输出,因此您应该将它写入的所有内容都保存到溢出的位置,当然

是的,我读过这篇文章,但这似乎意味着实际文件的结束。f.readline怎么知道孩子死了,不再输出了?f、 readline对子进程一无所知,是吗?@MarkGaleck我很确定,在子进程死之前,文件不会结束。您至少可以尝试测试一下,对于子进程健康死亡和死亡-9。@MarkGaleck readline对子进程一无所知。通常,当一个进程结束时,操作系统会关闭该进程打开的任何文件描述符,从而发出。是的,谢谢你,我检查过了,readline正常工作,f中的line正常工作。但是,当孩子在发射线时死亡时,这两种方法都不起作用。怎么做?是的,我查过了,谢谢,事实上,我也从新线得到了一个例外。但请解释一下,我该如何得到最后一行不完整的内容??它在哪里缓冲?操作系统正在缓冲它,所以读取它应该是可以的。我能想到的最后一行被切断的唯一情况是,如果你用-9而不是一些普通的信号终止它,它是在写的过程中。顺便说一句,我也检查了它,我得到了输入/输出错误,尽管我预计管道会断开。哦,好吧。。。
    while True:
        (rSet, _, _) = select.select([out], [], [], <some seconds>)
        if rSet:
            buf = os.read(out, <some length>)
            if buf:
                #process it, assembling lines
            else:
                #check if child dead, if so, bail out