Переменные аргументы Python не принимаются GNU Parallel
У меня есть код Python, который запускает симуляцию для меня, и мне нужно запустить этот код для ряда различных параметров (строка, целое число и другое строковое целое число). Моя проблема в том, что когда я пытаюсь распараллелить это с GNU-параллельной частью, мои аргументы не проходят (моя первая строка). Конкретная строка, которая, вероятно, ответственна за это:
parallel --bar --eta -j14 'python3 compute-heat-capacity-generational-2 $sim {1} {2}' ::: \
$(seq 16) ::: \
${gens[@]}
где ошибка msg я получаю от python:
Traceback (последний вызов был последним):
Файл "compute-heat-acity-generational-2", строка 20, вiterNum = int(argv[3]) > IndexError: список индексов вне диапазона
Таким образом, только два из моих аргументов проходят, те, назначенные {1}
а также {2}
в моей параллельной линии. По какой-то причине это не похоже на $sim
работает как задумано, когда я пытаюсь использовать параллель.
Полный сценарий написан ниже, где я беру каталог имитации в качестве входных данных, перебираю каталог для анализа номера поколения, а затем передаю оба из них в параллель, где я повторяюсь для всех поколений, и третий параметр повторяется ${seq 16}
Любой совет о том, как работать с параллельной, будет принята с благодарностью. Я провел большую часть последних нескольких дней за чтением руководств и примеров, но мне не удалось решить эту проблему. Я совершенно уверен, что проблема заключается в том, как я маркирую свои аргументы `{}'и передаю им входные данные, но я просто не могу найти правильную комбинацию, чтобы получить это с нуля.
#!/bin/bash
echo "Choose a simulation: "
read sim
echo "Starting Heat Capacity Calculations"
gens=(save/$sim/isings/*)
#find all generations in simulations folder, put into array
for ((i=0; i<${#gens[@]}; i++));
do
#find the generation number from file string
gens[i]=$(echo ${gens[$i]} | cut -d "[" -f2 | cut -d "]" -f1)
done
parallel --bar --eta -j14 'python3 compute-heat-capacity-generational-2 $sim {1} {2}' ::: \
$(seq 16) ::: \
${gens[@]}
1 ответ
Попробуйте использовать либо двойные кавычки в аргументе для параллельного, либо выполните export sim
перед звонком parallel
,
parallel --bar --eta -j14 "python3 compute-heat-capacity-generational-2 $sim {1} {2}" ::: \
$(seq 16) ::: \
${gens[@]}
- bash не раскрывает переменные в строках, если строка использует одинарные кавычки (
'
). - Если вы делаете
export sim
переменная будет видима для подпроцессов, а ваша переменная будет раскрыта позже.