我有一个 python 程序,我通过命令行(Mac OSX)运行它:
python -W ignore Experiment.py --iterations 10
该文件Experiment.py
应使用不同的值运行多次--iterations
。我一次又一次地手动执行此操作,因此当一次运行完成后,我会使用不同的 运行第二次运行--iterations
,依此类推。然而,我不能总是靠近我的笔记本电脑来运行所有这些,所以我想知道是否有一种方法shell script
可以一起声明所有运行,然后 shell 脚本一个接一个地执行它们(不是并行的,只是按顺序执行,就像我我会自己做吗)?就像是:
python -W ignore Experiment.py --iterations 10
python -W ignore Experiment.py --iterations 100
python -W ignore Experiment.py --iterations 1000
python -W ignore Experiment.py --iterations 10000
python -W ignore Experiment.py --iterations 100000
编辑:
如果我有多个参数怎么办--X --Y --Z
?
答案1
您可以使用 for 循环:
for iteration in 10 100 1000 10000 100000; do
python -W ignore Experiment.py --iteration "${iteration}"
done
如果您有多个参数,并且想要所有参数的所有各种排列,如@Fox 在下面的评论中指出的那样,您可以使用嵌套循环。例如,假设您有一个--name
参数,其值可以是n1
、n2
和n3
,那么您可以执行以下操作:
for iteration in 10 100 1000 10000 100000; do
for name in n1 n2 n3; do
python -W -ignore Experiment.py --iteration "${iteration}" --name "${name}"
done
done
例如,您可以将其放入文件中,runExperiment.sh
并将其作为第一行:#!/bin/bash
。然后您可以使用以下任一方法运行脚本:
bash runExperimen.sh
或者,您可以使脚本可执行,然后运行它:
chmod +x runExperiment.sh
./runExperiment.sh
如果您先对某些结果感兴趣,这将指导您如何构建循环。在上面的示例中,脚本将运行:
... --iteration 10 --name n1
... --iteration 10 --name n2
... --iteration 10 --name n3
... --iteration 100 --name n1
因此,它会运行第 10 次迭代的所有实验,然后再进行下一次迭代。相反,如果您希望n1
在进行下一个实验之前对名称进行所有实验,则可以将名称循环设置为“外”循环。
for name in ...; do
for iteration in ...; do
答案2
使用 GNU Parallel 时,它看起来像这样:
parallel -j1 python -W ignore Experiment.py --iterations {} ::: 10 100 1000 10000 100000
-j1
如果您想Experiment.py
为每个 CPU 核心并行运行一个,请删除该选项。
为了结合多个参数,我们假设您有:
-s = S, M, L
--size = small, medium, large
--color = red, green, blue
您想要-s L
链接到--size large
但具有以下所有组合--color
:
parallel echo s={1} size={2} color={3} ::: S M L :::+ small medium large ::: red green blue