我有一个Python脚本job.py
,它接受命令行参数。该脚本使用Python包subprocess
运行一些外部程序。脚本和外部程序都是顺序的(即没有MPI、openMP等)。我想运行这个脚本4次,每次使用不同的命令行参数。我的处理器有4个内核,因此我想同时运行所有4个实例。如果我打开4个终端,并在单独的终端中运行脚本的每个实例,那么它将完美地工作,并且我可以得到我想要的东西。在
现在我想让自己更容易地启动4个实例,这样我就可以从一个终端用一个命令完成所有这些。为此,我使用bash脚本batch.sh
:
python job.py 4 0 &
python job.py 4 1 &
python job.py 4 2 &
python job.py 4 3 &
这不起作用。原来subprocess
是这里的罪魁祸首。所有Python代码都运行得很好,直到到达subprocess.call
之后,我得到:
所以我认为,我试图在后台运行job.py
,而{subprocess
在后台运行其他东西。这显然行不通,原因我不明白。在
有没有一种方法可以在不需要多个终端的情况下运行job.py
多次?在
编辑1
根据建议,我尝试了multiprocessing
、thread
和{
konsole -e python job.py 4 0
konsole -e python job.py 4 1
konsole -e python job.py 4 2
konsole -e python job.py 4 3
编辑2
下面是使用subprocess.call
的实际函数(注意:subprocess
被导入为sp
)。在
def run_case(path):
case = path['case']
os.chdir(case)
cmd = '{foam}; {solver} >log.{solver} 2>&1'.format(foam=CONFIG['FOAM'],
solver=CONFIG['SOLVER'])
sp.call(['/bin/bash', '-i', '-c', cmd])
让我填一下空白点:CONFIG
是一个全局定义的字典。在CONFIG['FOAM'] = 'of40'
这是my.bashrc中的一个别名,用于为属于我正在运行的二进制文件的文件提供源代码。在CONFIG['SOLVER'] = 'simpleFoam'
这是我正在运行的二进制文件。在编辑3
我终于让它用这个了
def run_case():
case = CONFIG['PATH']['case']
os.chdir(case)
cmd = 'source {foam}; {solver} >log.simpleFoam 2>&1'.format(foam=CONFIG['FOAM'],
solver=CONFIG['SOLVER'])
sp.call([cmd], shell=True, executable='/bin/bash')
解决方案是同时设置shell=True
和{/bin/bash
以传递给shell。注意:foam
现在是指向文件的路径,而不是别名。在
您可以从Python中并行化:
它的优点是可以监视/记录/调试并行化。在
相关问题 更多 >
编程相关推荐