python - sys.stdin 多久生成一次数据?

标签 python linux pipe generator

我正在尝试使用这个单行代码来打印所有添加到文件 /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/

相关文章:

Python路径困惑: can import directory but not files?

linux - 在 linux 中使用 grep 将 xml 文件中包含的所有 url 传输到单独的文件

python - 无法使用 Python 中的 Mechanize 连接到安全网站

python - 关于模运算的行为?

linux - 检查 "cat"的输出是否不为空

linux - 在 ctrl+c 上终止 bash 中的管道子进程

perl - 如果文件不存在,为什么我到 zcat 的 Perl 管道不会死?

python - 有没有办法轮询从 subprocess.Popen 返回的文件句柄?

python - 用python捕捉系统事件

linux - SGX Sign enclave 无法证明构建的 enclave : Key file format is not correct