1

我正在尝试使用应该打印所有添加到文件中的行的单行/var/log/messages.log

sudo tail -f /var/log/messages.log | python2 -c 'exec("import sys\n\nfor line in sys.stdin:\n\tprint line")'

为了可读性,python代码是:

import sys

for line in sys.stdin:
        print line

如果我在 中添加一行/var/log/messages.log,则看不到任何打印内容。但是,如果我添加大量数据,我就会开始获得输出。

是否有关于生成器sys.stdin生成频率的定义行为data

PS:我的最终目标是了解输出每秒输入 python 程序的行数的单行器。

编辑:如何假设解释器if t > e:每隔一秒就会越过这条线?

4

2 回答 2

2

stdin被缓冲。

-u在 Python 2 中,您可以通过在启动 Python 时使用标志或设置PYTHONUNBUFFERED环境变量来禁用缓冲。

有一些注意事项需要注意,但这个答案最详细

于 2013-09-23T14:40:12.713 回答
2

好的,这对我有用:

import sys

while True:
    print sys.stdin.readline()

并以python -u ....

我承认 Thomas 到另一个线程的链接帮助我发现.readline()应该直接使用它才能-u产生任何效果。

说明:-u禁用 stdin 的进程级缓冲(如“标准输入”而不是sys.stdin具体的对象),并使用.readline()而不是for line in sys.stdin避免sys.stdin.

更新:关于你关于这条单线的问题:“如何假设口译员if t > e:每隔一秒就会越过这条线?” ...观察中的“单线”是:

import sys, time
l = 0
e = int(time.time())
for line in sys.stdin:
    t = int(time.time())
    l += 1
    if t > e:
        e = t
        print l
        l = 0

time.time()以秒为单位返回当前时间float;将其转换为int基本上只是将其四舍五入到整秒;并且第一个时刻int(time.time())大于e,也被设置为int(time.time()),几乎正好一秒钟过去了。

但是该片段仍然遭受与原始片段完全相同的输入缓冲问题;此外,它是在没有标志的情况下调用的-u,所以我无法想象为什么它会在任何系统上可靠地工作,除非该系统上的缓冲语义在 Python 进程 STDIN 级别以及sys.stdin.

于 2013-09-23T14:45:27.803 回答