python sys.stdin.read()从尾部-f

为什么sys.stdin.read()不会从tail -f读取pipe道input?

#!/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

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

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

你可以使用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) 

另外,你的脚本自动接受文件名作为参数。

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

您的文件没有任何EOF。 修改你的程序来读取固定大小的块,或者反复在leadline()上迭代。