python - 如何正确地将 Python 脚本输出重定向到文件?

标签 python bash shell

我正在尝试在服务器上远程运行脚本,我打算使用以下内容: 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 命令。然后它会显示所有预期的输出,直到脚本终止。

我认为“>”不断重定向 stdout 和 stderr,而不仅仅是在命令完成时。

最佳答案

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

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

根据python3 --help:

-u : force the stdout and stderr streams to be unbuffered; this option has no effect on stdin; also PYTHONUNBUFFERED=x

关于python - 如何正确地将 Python 脚本输出重定向到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70490995/

相关文章:

linux - 如何使用 shell 压缩 linux 中的特定文件夹

linux - 将更多文件的行数与文件名组合起来

bash - 更改 bash 中内置读取的制表符补全

Python str.contains 来自两个或多个字典

python - 如何在特定日期开始时间组pandas

python - 如何将不同排名的列表连接成排名 0 的单个列表?

linux - Bash:一次有两个 for 循环?

bash - Curl:绕过本地主机的代理

php - 如何使用 php 在远程 linux 机器上执行 shell 脚本

python - pandas:处理具有大量字符串的 DataFrame