我想在使用SGE(QSUB)的群集的不同节点上运行python函数,比如my_fun(x1,x2)
。我创建了一个脚本my_script.py
,它从命令行接收数字参数,因此在本地运行时,我将其称为
python my_script.py x1 x2
现在我想将此脚本提交到具有不同x1和x2值的循环中的集群。此外,对于节点可以访问python&安装的模块,我需要在通过QSUB调用python脚本之前在节点上运行module load Python/2.7
。
这似乎是一个非常简单和典型的用例,但我无法通过Python找到任何直接的方法。在BASH和Python之间来回走动似乎有点笨拙。
答案 0 :(得分:1)
我建议您根据节点数量将作业划分为多个独立的作业。
对于每个节点/核心,创建一个文件夹,其中包含该子作业应该处理的参数列表。然后在python中,编写一个脚本来读取文件并调用脚本(可能使用多处理模块进行多核支持)。
编辑:
如果要通过qsub传递其他参数,可以使用可以传递给脚本的参数调用qsub:
qsub -F "myarg1 myarg2 myarg3=myarg3value" myscript.sh
您可以找到此文档here
答案 1 :(得分:0)
这或多或少都是我所寻找的:
https://gist.github.com/timflutre/a9085660271bd059f71c
import sys
import subprocess
job_param1 = 12.5
job_param2 = 5.0
jobName = "python my_script.py %f %f" % (job_param1,job_param2)
cmd = "module load Python/2.7; sleep 0.2; %s" % jobName
echoArgs = ["echo", "-e", "'%s'" % cmd]
print(" ".join(echoArgs))
qsubArgs = ["qsub","-cwd"]
print(" ".join(qsubArgs))
wholeCmd = " ".join(echoArgs) + " | " + " ".join(qsubArgs)
out = subprocess.Popen(wholeCmd, shell=True, stdout=subprocess.PIPE)
out = out.communicate()[0]
jobId = out.split()[2]
print jobId