我正在尝试使用这个单行代码来打印所有添加到文件 /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:我的最终目标是理解 one-liner输出每秒被馈送到 python 程序的行数。
编辑:如何假设解释器将每隔一秒穿过这条线 if t > e:
?
最佳答案
好的,这就是对我有用的:
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
的内部缓冲。
更新:关于您关于这个 one-liner 的问题:“如何假设解释器每隔一秒就会越过这条线 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
的实现中。
关于python - sys.stdin 多久生成一次数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18962005/