Переменные аргументы 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[@]}
  1. bash не раскрывает переменные в строках, если строка использует одинарные кавычки (').
  2. Если вы делаете export simпеременная будет видима для подпроцессов, а ваша переменная будет раскрыта позже.
Другие вопросы по тегам