29

我正在运行包含通过 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

4 回答 4

31

默认情况下,print在 Python 中是缓冲的,这意味着它不会立即写入文件或标准输出,需要“刷新”以强制立即写入标准输出。

有关可用选项,请参阅此问题

最简单的选项是使用该选项启动 Python 解释器-u

python手册页:

-u 强制标准输入、标准输出和标准错误完全无缓冲。在重要的系统上,还将标准输入、标准输出和标准错误置于二进制模式。请注意,xreadlines()、readlines() 和文件对象迭代器(“for line in sys.stdin”)中有内部缓冲,不受此选项的影响。要解决此问题,您需要在“while 1:”循环中使用“sys.stdin.readline()”。

于 2017-08-26T16:32:02.867 回答
8

您可以使用:

python -u program.py > test2.out

您的所有输出都将保存到 test2.out 文件中。

于 2019-01-18T11:06:03.093 回答
6

你可以把

sys.stdout.flush()

在打印感兴趣的报表之后。或者从 python 3.3 开始

print("hey", flush=True)

是一种选择。python -u如果您经常打印,尤其是在共享文件系统上,使用无缓冲 IO(带)可能会降低性能。

于 2020-10-15T16:43:19.890 回答
1

以上解决方案没有为我带来实时输出。(您需要刷新打印并同步文件更改。)这是一个代码,您可以简单地添加到您的 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)
于 2021-05-27T16:11:24.590 回答