我正在运行一个包含SLURM打印语句的Python代码。通常当我通过" python program.py"直接运行Python代码时打印语句出现在终端中。当我通过SLURM运行我的程序时,正如预期的那样,打印语句不会出现在终端中。如何将打印语句保存到文件中,以便在程序运行时检查它们?以下是我通过" sbatch submit.sh"提交的提交脚本。请注意,我已经尝试了两种方法将输出写入test1.out或test2.out。请让我知道我哪里出错了!
#!/bin/bash
#SBATCH -J mysubmission
#SBATCH -p New
#SBATCH -n 1
#SBATCH -t 23:59:00
#SBATCH -o test1.out
module load gnu python
python program.py > test2.out
答案 0 :(得分:6)
默认情况下,Python中的print
是缓冲的,这意味着它不会立即写入文件或stdout,而是需要刷新'立即强制写入stdout。
有关可用选项,请参阅此question。
最简单的选择是使用-u
选项启动Python解释器。
来自python
手册页:
-u强制stdin,stdout和stderr完全无缓冲。在重要的系统上,还将stdin,stdout和stderr置于二进制模式。 请注意,在xreadlines(),readlines()和中有内部缓冲 文件对象迭代器("用于sys.stdin中的行")不是 受此选项的影响。要解决这个问题,您需要使用 " sys.stdin.readline()"在一个"而1:"循环。
答案 1 :(得分:1)
您可以使用:
python -u program.py > test2.out
所有输出将保存到test2.out文件。
答案 2 :(得分:1)
你可以放
sys.stdout.flush()
在感兴趣的打印语句之后。如果您经常打印,尤其是在共享文件系统上,使用无缓冲的IO(与python -u
一起使用)可能会降低性能。
答案 3 :(得分:0)
上述解决方案没有为我提供实时输出。 (您需要刷新打印并同步文件更改。)这是您可以简单地添加到您的 Python 脚本的代码。
#!/usr/bin/env python3.7
import sys
import builtins
import os
sys.stdout = open("stdout.txt", "w", buffering=1)
def print(text):
builtins.print(text)
os.fsync(sys.stdout)
print("This is immediately written to stdout.txt")
就是这样。
说明
重定向标准输出并在每个换行符后写入文件缓冲区。
sys.stdout = open("stdout.txt", "w", buffering=1)
覆盖打印功能并在操作系统端同步刷新的文件。
def print(text):
builtins.print(text)
os.fsync(sys.stdout)