쉘 스크립트를 사용하여 여러 매개변수가 있는 프로그램 실행

쉘 스크립트를 사용하여 여러 매개변수가 있는 프로그램 실행

명령줄(Mac OSX)을 통해 실행하는 Python 프로그램이 있습니다.

python -W ignore Experiment.py --iterations 10

파일은 Experiment.py다른 값으로 여러 번 실행되어야 합니다 --iterations. 저는 이 작업을 수동으로 반복해서 수행하므로 하나의 실행이 완료되면 다른 실행으로 두 번째 실행을 수행합니다 --iterations. 그러나 항상 랩톱 가까이에 있을 수는 없으므로 shell script모두 함께 실행하도록 선언한 다음 쉘 스크립트를 통해 하나씩(병렬이 아닌) 실행하도록 하는 방법이 있는지 궁금합니다. 그냥 순차적으로 그냥 나처럼 (내가 직접 할래?) 그것은 다음과 같습니다:

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일 수 있는 매개변수가 있다고 가정하면 다음을 수행할 수 있습니다.n1n2n3

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

-j1Experiment.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

관련 정보