Executando um programa com vários parâmetros usando o shell script

3

Eu tenho um programa python que eu executo via linha de comando (Mac OSX) como:

python -W ignore Experiment.py --iterations 10

O arquivo Experiment.py deve ser executado várias vezes usando diferentes valores --iterations . Eu faço isso manualmente, um após o outro, então quando uma corrida é finalizada, eu corro a segunda com diferentes --iterations , e assim por diante. No entanto, nem sempre consigo definir perto do meu laptop para executar todos eles, então estou querendo saber se há uma maneira de usar shell script onde posso afirmar todas as execuções e depois o shell script executa uma após a outra (Não é paralelo, apenas sequencialmente como eu teria feito por mim mesmo)? Algo como:

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

Editar: E se eu tiver vários argumentos --X --Y --Z ?

    
por Katherine 05.01.2018 / 15:56

2 respostas

3

Você pode usar um loop:

for iteration in 10 100 1000 10000 100000; do
    python -W ignore Experiment.py --iteration "${iteration}"
done

Se você tiver vários parâmetros e quiser todas as várias permutações de todos os parâmetros, como observado por @Fox em um comentário abaixo, você poderá usar loops aninhados. Suponhamos, por exemplo, que você tivesse um parâmetro --name cujos valores poderiam ser n1 , n2 e n3 , então você poderia fazer:

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

Você poderia colocar isso em um arquivo, por exemplo, runExperiment.sh e incluí-lo como a primeira linha: #!/bin/bash . Você pode então executar o script usando:

bash runExperimen.sh

Ou você pode tornar o script executável e executá-lo:

chmod +x runExperiment.sh
./runExperiment.sh

Se você estiver interessado em alguns resultados antes dos outros, isso guiará como você estrutura os loops. No meu exemplo acima, o script será executado:

... --iteration 10 --name n1
... --iteration 10 --name n2
... --iteration 10 --name n3
... --iteration 100 --name n1

Portanto, ele executa todos os experimentos para a iteração 10 antes de passar para a próxima iteração. Se, em vez disso, você quisesse todas as experiências para o nome n1 antes de passar para a próxima, você poderia fazer o nome fazer o loop "externo".

for name in ...; do
    for iteration in ...; do
    
por 05.01.2018 / 15:58
0

Com o GNU Parallel, é assim:

parallel -j1 python -W ignore Experiment.py --iterations {} ::: 10 100 1000 10000 100000

Remova -j1 se você deseja executar um Experiment.py por núcleo da CPU em paralelo.

Para combinar com vários argumentos, vamos supor que você tenha:

-s = S, M, L
--size = small, medium, large
--color =  red, green, blue

Você deseja que -s L seja vinculado a --size large , mas com todas as combinações de --color :

parallel echo s={1} size={2} color={3} ::: S M L :::+ small medium large ::: red green blue
    
por 07.01.2018 / 01:47