Python写入缓冲区而不是文件
我对Python还很陌生,但我遇到了一个我无法解释/解决的奇怪行为。 基本上,我需要将python脚本输出转发到一个文件 例如:Python写入缓冲区而不是文件,python,python-3.x,file,output,stdout,Python,Python 3.x,File,Output,Stdout,我对Python还很陌生,但我遇到了一个我无法解释/解决的奇怪行为。 基本上,我需要将python脚本输出转发到一个文件 例如: while True: print('tick') time.sleep(5) 然后将输出重定向到该文件 python test.py >> test.log 2>&1 但问题是,在脚本完成之前,文件是空的。 看起来它将输出写入某个缓冲区,并且只在最后将该缓冲区发送到文件 这对我来说是完全不可接受的,因为我有一个24/7运行的脚本
while True:
print('tick')
time.sleep(5)
然后将输出重定向到该文件
python test.py >> test.log 2>&1
但问题是,在脚本完成之前,文件是空的。
看起来它将输出写入某个缓冲区,并且只在最后将该缓冲区发送到文件
这对我来说是完全不可接受的,因为我有一个24/7运行的脚本,在这种情况下,我将永远无法获得正确的日志。我需要实时写入文件
我知道它可能是通过使用
with open('test.log', mode='a') as log_file:
但在这种情况下,我将无法在终端中查看结果。
除此之外,我将严格限于脚本内部指定的文件
我想这实际上不是Python的问题,而是更一般的问题。
不过,是否可以像我在终端中看到的那样,对文件进行即时写入
看起来它会将输出写入某个缓冲区
没错。您可以使用禁用此功能,因此:
试试这个:
with open('log.log', 'w+') as log_file:
print('tick', file=log_file)
这样,打印输出将转到文件而不是stdout您可以更改Python的缓冲,但可能还需要更改终端/OS缓冲。您是否考虑过让您的脚本知道其写入的位置?在Unix上,脚本通常将路径视为stdout。要登录python,应该使用实现的日志类,其中所有函数都是现成的。
with open('log.log', 'w+') as log_file:
print('tick', file=log_file)