执行tail -f命令时,不能实时看到print命令的输出

发布时间 2023-11-01 15:23:26作者: jingsupo

下面的代码,保存到文件z.py里面。

import time
from tqdm import tqdm


for vin in tqdm(range(10)):
    print(vin)
    time.sleep(1)

后台执行:nohup python3 z.py > z.log 2>&1 &
执行tail -f z.log,不能够实时看到print(vin)的打印结果,而是程序结束后一次性输出,为什么?

当你使用 nohup 命令将 Python 脚本放入后台执行时,它将脱离终端并且不再将标准输出(stdout)和标准错误输出(stderr)直接连接到终端。这就是为什么你在执行 tail -f z.log 时不能实时看到 print(vin) 的输出。

为了实时查看输出,你可以在 Python 脚本中使用以下方法之一:

  1. 使用 sys.stdout.flush():在每次打印后手动刷新标准输出。这样可以强制将缓冲区的内容刷新到文件中,从而实时看到输出。你需要导入 sys 模块来使用它。

    import time
    from tqdm import tqdm
    import sys
    
    for vin in tqdm(range(10)):
        print(vin)
        sys.stdout.flush()
        time.sleep(1)
    
  2. 使用 -u 选项:在命令行中使用 python3 -u 来执行脚本。这个选项会禁用输出缓冲,从而实时查看输出。示例:

    nohup python3 -u z.py > z.log 2>&1 &
    

使用其中一种方法,你应该能够实时查看脚本的输出,而不是在程序结束后才看到。