我正在尝试使用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)
答案 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。