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