为什么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()上迭代。