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