【问题标题】:How to properly redirect Python script output to file?如何正确地将 Python 脚本输出重定向到文件?
【发布时间】:2022-01-26 03:41:22
【问题描述】:

我正在尝试在服务器上远程运行脚本,并且打算使用以下几行内容: nohup ./script.py > runtime.out 2> runtime.err & 并使用 tail -f runtiime.out 监控脚本的进度。我遇到的问题是重定向似乎没有按预期工作。出于我的问题的目的,我的问题可以如下所述重现:

脚本.py:

#!/usr/bin/env python3

import time
if __name__=='__main__':
    for i in range(1000):
        print("hi")
        time.sleep(1)

然后在 shell 中运行./print.py > a.out &。这将给出进程的 PID,并将按预期退出。然而,尽管程序正在运行,a.out 仍为空。此外,如果我在没有'&'的情况下执行./print.py > a.out ,则a.out 文件将保持为空,直到我按Ctrl-C 命令。然后它会显示所有预期的输出,直到脚本终止。

我认为“>”会不断重定向标准输出和标准错误,而不仅仅是在命令完成时。

【问题讨论】:

  • @JervenClark 为什么会这样?无需在 Python 中打开文件。标准输出可以被刷新或无缓冲,如两个答案所示。
  • @JohnKugelman 谢谢你。我之前不知道你可以使用 print 刷新。我只知道你可以在一个文件中做。

标签: python bash shell


【解决方案1】:

最简单的方法就是使用python 命令的-u 标志。它应该是这样的:

nohup python3 -u script.py > runtime.out 2> runtime.err &

根据python3 --help

-u :强制 stdout 和 stderr 流无缓冲; 此选项对标准输入没有影响;还有 PYTHONUNBUFFERED=x

【讨论】:

    【解决方案2】:

    使用print("hi", flush=True) 将继续强制流刷新内容,因此它将不断更新输出文件。我没有关于您的程序的足够信息来建议替代方案,但如果可能的话,我会寻找更好的方法。

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多