Python:清除标准输入缓冲区

da_steve101

这可能是一个nooby问题,但我找不到解决方法!我需要清除python中的stdin缓冲区。

想象一下,我正在运行以下bash脚本:

i=0
for (( ; ; ))
do
    echo "$i"
    ((i++))
done

从命令行运行,如下所示:./loop.sh | python myProg.py

我希望在myProg.py中具有以下内容:

count = 100
f = fileinput.input()
while True:
    sleep(2)
    # clear stdin somehow ...
    # and read the most recent 100 lines
    i = 0
    while i < count:
        myBuffer[i] = f.readline()
        if len(myBuffer[i]) > 0:
            i += 1
    print myBuffer

我不认为我能阅读所有内容,因为它会以很高的速度吐痰,如果睡眠(仅用于测试atm)几分钟,这似乎很愚蠢……有没有办法设置python中的stdin缓冲区大小?或者只是截断/清除它?顺便说一句即时通讯使用python 2所以没有bufsize参数

我在这里看看如何避免Python文件输入缓冲

任何Python的方式做到这一点?但也尝试不缓冲:https : //unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

更新:没有缓冲或stdbuf的运气...

da_steve101

万一其他人遇到这个问题,我已经进行了广泛的搜索并得出结论,由于内核实现等原因是不可能的...

我写了以下工作来做我想做的事。我创建了两个文件:textFilter.py和getLatest.py。本质上,您运行./loopPrinting.sh | python textFilter.py并获取最新的100行。我有理由确定这是原子性和可靠的(尽管如果不是,请告诉我!!!)。它创建16个文件并更改计数(类似于我认为的Apple live stream)。

textFilter.py

import sys
import os
import time

def mainLoop(size):
    myBuffer = [0]*size
    count = 0

    while True:
        for i in range(size):
            myBuffer[i] = sys.stdin.readline()

        f = open('/home/development/textFilter/' + repr(count) + '.dat', 'w')
        f.write(''.join(myBuffer))
        f.close()

        f = open('/home/development/textFilter/count.dat~', 'w')
        f.write(repr(count))
        f.flush()
        os.fsync(f.fileno()) 
        f.close()
        time.sleep(0.01)
        os.rename('/home/development/textFilter/count.dat~','/home/development/textFilter/count.dat')

        count += 1
        count = count % 16

if __name__ == "__main__":
    try:
        mainLoop(int(sys.argv[1]))
    except Exception:
        mainLoop(100)

getLatest.py

import sys
import time

def getData():
    f = open('count.dat', 'r')
    count = f.read()
    f.close()

    count = int(count)
    oldCount = count

    while oldCount == count:
    time.sleep(0.1)
    f = open('count.dat', 'r')
    count = f.read()
    f.close()
    count = int(count)

    f = open(repr(count) + '.dat', 'r')
    data = f.readlines()
    f.close()

    for row in data:
    print row,

    return 0

if __name__ == "__main__":
    try:
    getData()
    except Exception as inst:
    sys.stderr.write('ERROR')
    sys.stderr.write(inst)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Linux:python:在raw_input()之前清除输入缓冲区

来自分类Dev

Python中的Memset(),清除缓冲区

来自分类Dev

getch()和getchar()清除输入缓冲区的用法的区别?

来自分类Dev

在另一个输入请求之前清除cin缓冲区,c ++

来自分类Dev

清除键盘缓冲区

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

当stdin非交互时如何清除python中的stdin缓冲区

来自分类Dev

如何清除ReplaySubject上的缓冲区?

来自分类Dev

我如何正确地从标准输入中读取带有缓冲区的输入而不会截断任何单词?

来自分类Dev

清除cout缓冲区(C ++)

来自分类Dev

在C中的fgets()之后清除输入缓冲区

来自分类Dev

强制在scanf中清除缓冲区

来自分类Dev

快速将标准输入快速读入缓冲区,无需检查

来自分类Dev

清除MIDI输出缓冲区

来自分类Dev

scanf读取后输入缓冲区是否被清除?

来自分类Dev

清除键盘缓冲区或阻止输入(C#控制台)

来自分类Dev

Python中的Memset(),清除缓冲区

来自分类Dev

增加Python的标准缓冲区大小

来自分类Dev

缓冲区溢出的参数输入

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

检查cin输入,清除输入缓冲区

来自分类Dev

清除缓冲区标准输入

来自分类Dev

如何清除Neovim缓冲区

来自分类Dev

如何刷新SerialDevice的输入缓冲区

来自分类Dev

Tmux,禁用缓冲区清除功能

来自分类Dev

从 SuperpoweredAndroidAudioIO 输入读取缓冲区?

来自分类Dev

读取c中的输入后如何清除缓冲区?

来自分类Dev

在 C++ 中清除空输入缓冲区的安全操作

来自分类Dev

标准输入流 (pubsetbuf) 使用的内部缓冲区