如何从无限Popen.stdout对象中获取最后N行

如何从无限Popen.stdout对象中获取最后N行

问题描述:

我想从当前时间无限Popen.stdout对象中获取最后N行。而无限的我的意思是无限/很多日志条目正在写入标准输出。 我试着Popen.stdout.readline()受时间限制,但这只是产生了很多随机问题,尤其是输出很少。 当前输出的某种快照会帮助我,但我无法找到类似的东西。我主要找到的所有解决方案都是针对终止的外部进程,但我是一个服务器应用程序,应该能够在读取最后一行后写入stdout。如何从无限Popen.stdout对象中获取最后N行

问候,

Faerbit

+0

虽然这是一个简单的图书馆,但也许是矫枉过正:我会为此工作推荐'pexpect'。至少它解决了像子程序缓冲整个数据页面这样的问题,因为它的stdout看起来不是终端。 – 2013-02-17 18:53:38

+0

我不知道这将如何帮助我。它看起来和Popen有相同的阅读方法。 (他们的网页也很怪异。) – Faerbit 2013-02-17 19:51:25

+0

你能否给出一个更清晰的例子,说明'无限'Popen是什么意思?是否就像你有Popen'ed子进程像一个不断喷出日志条目的Web服务器,然后你想在控制主进程中获得N行? – sotapme 2013-02-17 21:09:10

在Unix上,当您启动过程中,你可以把它管道到tail第一:

p=subprocess.Popen("your_process.sh | tail --lines=3", stdout=subprocess.PIPE, shell=True) 
r=p.communicate() 
print r[0] 

shell=True用法是这里的关键。

+0

这不起作用,因为您错过了关键问题:输出是无限的!尾部以及沟通()仅适用于终止的进程。在服务器日志上这是行不通的,因为你的服务器应该一直在运行。 – Faerbit 2013-02-18 12:42:32

+0

最后N行比什么都少? – 2013-02-18 14:14:33

+0

考虑将文件输出到文件中,并在该文件上定期运行尾部。如果输出已经记录到日志文件中,您可以“拖尾”日志文件 – 2013-02-18 14:36:52