这可能是一个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的运气...
万一其他人遇到这个问题,我已经进行了广泛的搜索并得出结论,由于内核实现等原因是不可能的...
我写了以下工作来做我想做的事。我创建了两个文件: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] 删除。
我来说两句