在SLURM中运行程序时如何保存打印语句?

时间:2015-10-16 19:48:51

标签: python slurm

我正在运行一个包含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

4 个答案:

答案 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)