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

python sys.stdin.read()来自tail-f,python,linux,bash,stdin,geoip,Python,Linux,Bash,Stdin,Geoip,为什么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:

为什么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])。\124; python mygeoip.py

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。修改您的程序以读取固定大小的块或在引线()上迭代。

您可以使用
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)
另一方面,脚本也自动接受文件名作为参数。

其他答案(即使是
fileinput
)都不能完全解决缓冲问题,因此对于
tail-f
的小输出也不起作用

发件人:

注意,在xreadlines()、readlines()和 文件对象迭代器(“对于sys.stdin中的行”),它不是 受此选项的影响。要解决此问题,您需要使用 “sys.stdin.readline()”在“while 1:”循环中

换句话说,你想要的是:

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

1.您是否确定有输出要读取,以及2
sys.stdin.read()?它当然应该可以工作——当然不会返回,但目标不是函数永远返回,而是在内容流入时打印新的查找结果。我想知道这个问题是否与缓冲有关,这需要更多地了解“here”和测试过程(即,文件中添加了多少项,以及是否足以超过POSIX标准为
tail
保证的
行最大*10
最大缓冲区大小)。