在bash文件中多次运行python脚本

在bash文件中多次运行python脚本

我想使用各种参数多次运行 python 脚本。为此,我编写了以下 bash 脚本:

requests=(25 50 75 100)
factors=(3 6)
graphsizes=(25 50 75)

for request in "${requests[@]}"; do
    for factor in "${factors[@]}"; do
        for size in "${graphsizes[@]}"; do
            echo "Now Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
            echo nohup python3 -u main.py "$request" 50 "$factor" "$size" > ${request}_${factor}_${size}.log &
            echo "Done Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
        done
    done
done

;我在第一个和最后一个的末尾添加,echo因为我不希望它们并行运行。事实上,我希望对 python 脚本的每次调用都main.py按顺序运行而不是并行运行,因为脚本本身已经并行化并且不需要任何竞争条件。

我知道通常我们使用 a;来使作业按顺序运行,但是如果我&在 nohup 行之后执行此操作,则会收到错误

syntax error near unexpected token `;'

如何使循环的每次迭代按顺序运行?

答案1

您编写脚本的方式,在多行中,“;”由换行符暗示。您可以删除“;”在最内循环内三行的每一行的末尾for,脚本将按顺序运行。你只需要';'如果您将事物移到同一行,而它们之间应该有休息,例如当您将它们放在与您的规范do相同的行时。请注意下面重写的脚本中for的替代位置:do

for request in "${requests[@]}" 
do
  for factor in "${factors[@]}"
  do
    for size in "${graphsizes[@]}"
    do
        echo "Now Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out
        echo nohup python3 -u main.py "$request" 50 "$factor" "$size" > ${request}_${factor}_${size}.log 
        echo "Done Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out
    done
  done
done

答案2

当组合数量变多时,你的计算机就会不堪重负。

这就是 GNU Parallel 派上用场的地方:

nohup parallel -j100% --header : python3 -u main.py {request} 50 {factor} {size} '>' {request}_{factor}_{size}.log \
   ::: request 25 50 75 100 \
   ::: factor 3 6 \
   ::: size 25 50 75

如果您不想为每个 CPU 核心运行一项作业,请更改 -j100%。

相关内容