【问题标题】:How do I save print statements when running a program in SLURM?在 SLURM 中运行程序时如何保存打印语句?
【发布时间】:2016-01-15 16:20: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

【问题讨论】:

  • 您确定您知道这些文件是在哪个目录中创建的吗?尝试一个完全限定的路径名​​。
  • 我看到 test1.out 和 test2.out 都是在我运行 sbatch 的目录中创建的。但是这些文件是空白的。不过我会尝试添加路径名。
  • 添加路径名没有解决问题。
  • 通过使用 sys.stdout.write 而不是 print 来强制输出到标准输出。考虑使用logging 模块。
  • sys.stdout.write 有效。谢谢!

标签: python slurm


【解决方案1】:

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

有关可用选项,请参阅此question

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

来自python 手册页:

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

【讨论】:

    【解决方案2】:

    你可以使用:

    python -u program.py > test2.out
    

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

    【讨论】:

      【解决方案3】:

      你可以放

      sys.stdout.flush()
      

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

      print("hey", flush=True)
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多