使用python自动创建bash脚本

时间:2019-07-19 10:39:45

标签: python bash slurm

我正在尝试为我提出的here一个问题寻求帮助,并且通过进一步的研究,我认为Python脚本可能是答案。就是说,我是Python的新手,不知道如何实现我的想法,或者这是否正确。

基本上,我认为我需要一个Python脚本,该脚本可以接收我传递的变量,然后将这些变量写入.sh文件。有没有简单的方法可以做到这一点?

编辑: 在回应一些评论时,我认为我应该再说明一下我的问题。

我正在通过SLURM脚本运行matlab函数。 SLURM脚本是(我认为)一种bash脚本,但专门用于在HPC上调度作业。我的问题是,例如,我想一次提交十个作业,但所有作业都将特定变量更改为某个值。现在,问题是我不能仅以简单的方式执行此操作,因为据我所知,没有将变量传递给SLURM脚本的好方法。因此,我目前正在做的事情实际上是提交脚本的十个版本,每个版本都有自己的固定变量-然后,当我要提交所有作业时,我打开这十个脚本中的每一个并手动更新共享变量,然后一一运行。 我认为我需要的是一个Python脚本,它将进入每个SLURM脚本并对其进行编辑。

4 个答案:

答案 0 :(得分:0)

要回答与SLURM相关的实际问题,您应该looks like在创建作业时使用--export来定义变量,然后将其用作您的作业的环境变量:

sbatch --export=A=5,b='test' jobscript.sbatch

引用the manual的完整性:

  

--export=<environment variables [ALL] | NONE>

     

确定提交环境中的哪些环境变量将传播到启动的应用程序。默认情况下,所有传播。多个环境变量名称应以逗号分隔。可以指定环境变量名称以传播当前值(例如“ --export = EDITOR”),也可以导出特定值(例如“ --export = EDITOR = / bin / emacs”)。 [...]

答案 1 :(得分:0)

这将创建内容相同但编号不同的文件

    def writeFile(number):
        f = open(filename+str(number)+".slurm","w")
        f.write(content+str(number)+content)
        f.close()

答案 2 :(得分:0)

有两种方法可以解决您的问题:

  1. 您可以使用slurm arrays

下面的示例循环显示数字1-16:

#!/bin/bash

#SBATCH --job-name=array
#SBATCH --output=array_%A_%a.out
#SBATCH --error=array_%A_%a.err
#SBATCH --array=1-16
#SBATCH --time=01:00:00
#SBATCH -p partition-name
#SBATCH --ntasks=1
#SBATCH --mem=4G

# Print the task id.
echo "My SLURM_ARRAY_TASK_ID: " $SLURM_ARRAY_TASK_ID

# run code
./exec ${SLURM_ARRAY_TASK_ID}-inputfile.i
  1. 您可以使用python Template strings

这是一个例子

在下面的generate-scripts.py中可以循环显示0-10,但是您可以将其替换为字符串或其他任何东西-功能强大:

template = None
# Create input files from boiler plate
with open(templatefname, "r") as template_f:
    template_string = template_f.read()
    template = Template(template_string)

for i in range(10):
    newfilestrin = template.safe_substitute(var=str(i))

然后您可以在模板文件中拥有

# blah blah
./run ${var}

我已经使用了两种解决方案。如果您更改的输入只是增加整数,则SLURM数组很方便。 Python模板字符串或文件功能更强大,但工作量更大。

答案 3 :(得分:0)

我建议simple-slurm,这是我为 Slurm 开发的 Python 包装器。 然后,您可以使用简单的 Python 逻辑和变量来创建作业。