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

2024-06-01 21:57:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

pid, out = pty.fork()
if pid:

现在我想从子输出读取行,直到它结束(我可以用非阻塞的waitpid(pid)检查)。你知道吗

我想这样做:

    f = os.fdopen(out)

现在呢

    for line in f:

或者

    while True:
        f.readline()

但这里至少有两个问题: 1假设孩子在发出最后一行时死了。现在forreadline将抛出一个异常,如何从异常处理程序内部读取不完整的行?你知道吗

  1. 如果子代产生一个孙子,然后死亡,那么forreadline将立即抛出异常。我想等一下孙子的输出。你知道吗

另一种选择是

    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

但这相当麻烦,需要我自己费力地组装生产线。你知道吗

这是最好的办法,还是有更好的办法?你知道吗


Tags: 文件对象trueforreadlineifossome
2条回答

python doc

if f.readline() returns an empty string, the end of the file has been reached, while a blank line is represented by '\n', a string containing only a single newline.

我相信来自子进程的管道将被关闭,并且在尝试从中读取时将出现IOError。你知道吗

编辑(在编辑之后):操作系统在管道中缓冲输出,因此您应该得到它写入的所有内容(当然,直到它溢出为止)

相关问题 更多 >