繁体   English   中英

来自tail -f的python sys.stdin.read()

[英]python sys.stdin.read() from tail -f

为什么sys.stdin.read()没有从tail -f读取管道输入?

#!/usr/bin/env python
import sys
from geoip import geolite2
def iplookup(srcip):
        for ip in srcip.split("\n"):
                try:
                        print(geolite2.lookup(ip))
                except:
                        pass
source = sys.stdin.read()
iplookup(source)

tail -f /var/log/bleh.log | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' | python mygeoip.py

其他答案(甚至fileinput )都没有完全解决缓冲问题,因此不适用于tail -f小输出。

python手册页

请注意,xreadlines(),readlines()和file-object迭代器(“for sys.stdin中的行”)中存在内部缓冲,不受此选项的影响。 要解决此问题,您需要在“while 1:”循环中使用“sys.stdin.readline()”。

换句话说,你想要的是:

while True:
    line = sys.stdin.readline()
    iplookup(line)

您可以使用fileinput

import sys
from geoip import geolite2
import fileinput

def iplookup(srcip):
        for ip in srcip.split("\n"):
                try:
                        print(geolite2.lookup(ip))
                except:
                        pass

for line in fileinput.input():
    iplookup(line)

从好的方面来说,您的脚本也会自动接受文件名作为参数。

您可以使用sys.stdin作为迭代器,而不是先尝试从中读取它。

def iplookup(srcip):
    for ip in srcip:
        ip = ip.strip()
        try:
            print(geolite2.lookup(ip))
        except:
            pass

iplookup(sys.stdin)

read()读取直到达到EOF。 执行close()时添加EOF char,或者可以显式添加。

您的文件没有任何EOF。 修改程序以读取固定大小的块或替代引线()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM