【问题标题】:Python writes to a buffer instead of a filePython 写入缓冲区而不是文件
【发布时间】:2020-08-16 19:25:54
【问题描述】:

我对 Python 很陌生,但我遇到了一个我无法解释/解决的奇怪行为。 基本上,我需要将 python 脚本输出转发到一个文件。

例子:

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 问题,而是更通用的问题。 不过,是否可以像我在终端中看到的那样即时写入文件?

【问题讨论】:

  • 您可以更改 Python 的缓冲,但您可能还需要更改终端 /OS 缓冲。您是否考虑过让您的脚本知道它写入的位置?在 Unix 上,脚本通常将“路径”视为标准输出。
  • 要登录python,您应该使用实现的logging 类,其中所有功能都开箱即用。

标签: python python-3.x file output stdout


【解决方案1】:

看起来它会将输出写入某个缓冲区

没错。您可以使用flush=True 禁用此功能,因此:

while True:
  print('tick', flush=True)
  time.sleep(5)

【讨论】:

    【解决方案2】:

    试试这个:

    with open('log.log', 'w+') as log_file:    
    print('tick', file=log_file)
    

    这样打印输出将转到文件而不是标准输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2014-01-29
      • 2019-04-28
      • 1970-01-01
      • 2012-05-14
      相关资源
      最近更新 更多