【问题标题】:python buffering in sys.stdoutpython 在 sys.stdout 中缓冲
【发布时间】:2023-02-04 04:06:06
【问题描述】:

最小的例子:

def main():
    for i in range(100):
        print("One line every 2s", end = "\n")
        time.sleep(2)
if __name__ == '__main__':
    with open("log.out", 'w') as out, open("log.err", 'w') as err:
        sys.stdout = out
        sys.stderr = err
        main()

我希望在每一行之后将打印语句写入标准输出文件。我尝试失败:

python -u thisfile.py

在 bashrc (zshrc)


PYTHONUNBUFFERED = 1 
open("log.out", 'wb', buffering = 0) 

更改主要功能不是实际情况的选择。我使用 bash 运行 python 文件并重定向错误和输出的解决方案很艰难。

我知道有很多这样的问题,但似乎没有一个对我有用。

该解决方案应该适用于 python 3.8 和更新版本。

【问题讨论】:

  • 所以我想你不能使用print(..., flush=True)
  • sys.stdout 设置为不同的文件句柄并不意味着新文件句柄会继承原始标准输出所使用的任何缓冲。
  • 什么你改变了脚本?
  • 理想情况下,我不想更改分散在某些文件中的所有打印语句,但我想这将是我最后的选择
  • 理想情况下,我只想更改 if 中的代码姓名==“主要”部分

标签: python stdout buffering


【解决方案1】:

您可以使用 subprocess module 来运行具有所需选项的脚本,并将输出和错误流重定向到日志文件:

import subprocess

with open("log.out", "w") as out, open("log.err", "w") as err:
    subprocess.run(["python", "-u", "thisfile.py"], stdout=out, stderr=err)

这将以无缓冲模式(-u 选项)运行脚本并将输出和错误流重定向到指定的日志文件。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多