使用python进行作业控制

时间:2017-03-22 06:22:52

标签: python bash

我正在尝试使用python进行作业控制。使用bash,bash脚本看起来像:

i=0

for mu_Li in `seq -17 0.1 -14`  
do mkdir mu_$mu_Li
cp mc.x POSCAR BCLUST CLUST CSPECS  configuration  factor_group FBCLUST FCLUST point_group  PRIM mc_input configuration.corr  eci.in reference relax.log SCEL eci.out mu_$mu_Li
#cp ../POSCAR mu_$mu_Li\_$mu_Ni/POSCAR
 cd mu_$mu_Li
 sed -i "s/^\(Na \)[0-9-][.0-9-]*\(.*mu init\)/\1${mu_Li}\2/" mc_input

 sed -i "s/^\(Na \)[0-9-][.0-9-]*\(.*mu min\)/\1${mu_Li}\2/" mc_input

 sed -i "s/^\(Na \)[0-9-][.0-9-]*\(.*mu max\)/\1${mu_Li}\2/" mc_input

 ./mc.x 2>&1 > /dev/null  &
 cd ..

i=$((i+1))
if (( $i % 16 == 0 ))   
then 
wait
rm mu_*/MCLUST[0-9] mu_*/configuration*  mu_*/FBCLUST  mu_*/*CLUST mu_*/mc.x
fi
done
wait

关键是我想使用所有可用内核运行多个./mc.x 2>&1 > /dev/null &并在后台使用wait。 我应该把所有东西都变成python中的字符串,如:

    COMMAND = r"""line1;line2;line3;etc."""
    subprocess.Popen(COMMAND, shell=True).communicate(input=None)

1 个答案:

答案 0 :(得分:2)

下面是如何使用subprocess生成多个后台进程然后等待它们的草图。在这个例子中,每个过程都在睡觉。

import subprocess
p1 = subprocess.Popen(['sleep', '1'])
p2 = subprocess.Popen(['sleep', '2'])

# Wait for all processes to complete and get list of return codes
rcs = [p.wait() for p in (p1, p2)]

有关详细信息,请参阅documentation