有些童鞋写了python脚本在linux执行,发现pingt打印的内容并不是预想的一样直接输出,不能实时获取python脚本输出日志,而是在脚本执行完成后才输出,这是啥子原因呢?
其实这是python缓冲区的问题
在我们调用print后,并不是立即就打印的,一般会先将内容发送到缓冲区,然后再打印,如果缓冲区没满,不会打印,如果你想立即看到,就需要刷新缓冲区
主动调用刷新是最安全方式,对于耗时比较长的python脚本,可以实时获取日志信息
import sys
import time
for i in range(10):
print(i)
time.sleep(1)
该实验会每隔一秒打印一个数字,输出会自动的刷新缓存,因为print默认时以‘\n’结尾,遇到换行就会显示出来
import sys
import time
for i in range(10):
print(i, end =' ')
time.sleep(1)
该实验在前9秒不会打印数据,只会在第10秒的时候把之前的数据一并打印出来,因为用空格作为print的分隔符,不会触发缓存刷新
import sys
import time
for i in range(10):
print(i, end =' ')
sys.stdout.flush()
time.sleep(1)
该输出就会每隔一秒打印一个数字,因为代码主动刷新了缓存
import sys
import time
for i in range(10):
print(i, end =' ', flush = True)
time.sleep(1)
当然了print本身也提供了flush参数,通过设置也可以主动刷新
可以在调用python脚本时,添加==-u==参数,会强制其标准输出也同业标准错误一样,不通过缓存直接打印到屏幕
小记录:在有的python版本中加不加-u参数好像都是一样的,不起作用,具体没搞太明白,不知道是否是版本存在问题