#gnu-parallel
Вопрос:
Я пытаюсь передать как командную строку, так и отдельные аргументы из входного файла в GNU parallel. Мой сценарий выглядит так:
parallel="parallel --delay 0.2 -j 100 --joblog remaining_runs_$1.log --resume "
$srun $parallel {python3 scaling.py {1} {2} {3}} < missing_runs_$1.txt
Скрипт python принимает в качестве аргументов 3 отдельных целых числа, каждое из которых указано в missing_runs_$1.txt вот так:
1 1 153
1 1 154
1 1 155
1 1 156
1 1 157
1 1 158
...
Я пробовал использовать --colsep
, но это приводит к тому, что параллельно передаются только аргументы файла, в которых отсутствует python3 scaling.py
часть. Без --colsep
каждой строки файла интерпретируется как строка, которая также не является тем, что я хочу (например, python3 scaling.py '1 1 153'
). Есть какие-нибудь идеи?
Комментарии:
1. Это не обсуждение программирования, но вы могли бы попробовать этот синтаксис:
parallel --delay 0.2 -j 100 --joblog remaining_runs_$1.log --resume python3 scaling.py {1} {2} {3} :::: < missing_runs_$1.txt
2. Что ты получаешь от
--dryrun
этого ?3. @RonaldoFerreiradeLima @Ole удаление —colsep и апострофов, т. Е. запуск
parallel --delay 0.2 -j 100 --joblog curtailment_scaling_remaining_$1.log --resume python3 scaling.py {1} {2} {3} :::: < missing_runs_$1.txt
этого, я получаю:python3 curtailment_scaling.py '1 1 163'
я пробовал разные комбинации, это либо разделит входные данные и пропустит другую часть команды, либо сохранит входные данные в виде строки.4. @антония-извини, я недооценила твою проблему.
Ответ №1:
С базой данных во входном образце я создал воспроизводимый пример, чтобы проверить эту проблему:
Простой скрипт на python:
#!/usr/bin/python
import sys
for i in range(1, len(sys.argv)):
print(f'The argument number {i} is {sys.argv[i]}.')
И упрощенная командная строка:
parallel --dry-run -j 100 --colsep ' ' ./python.py {1} {2} {3} :::: < missing_runs_1.txt
./python.py 1 1 153
./python.py 1 1 154
./python.py 1 1 155
./python.py 1 1 156
./python.py 1 1 157
./python.py 1 1 158
без --dry-run
:
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 153.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 154.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 155.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 156.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 157.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 158.
Используя все аргументы из вашей параллельной команды, в файле remaining_runs_1.log я получил:
Seq Host Starttime JobRuntime Send Receive Exitval Signal Command
1 : 1630591288.009 0.021 0 86 0 0 ./python.py 1 1 153
2 : 1630591288.220 0.040 0 86 0 0 ./python.py 1 1 154
3 : 1630591288.422 0.035 0 86 0 0 ./python.py 1 1 155
4 : 1630591288.649 0.041 0 86 0 0 ./python.py 1 1 156
5 : 1630591288.859 0.042 0 86 0 0 ./python.py 1 1 157
6 : 1630591289.081 0.040 0 86 0 0 ./python.py 1 1 158
Я думаю, что это может решить проблему или, по крайней мере, дать новые идеи для окончательного решения.
Ответ №2:
Если
parallel --delay 0.2 -j 100 --joblog curtailment_scaling_remaining_$1.log --resume python3 scaling.py {1} {2} {3} :::: < missing_runs_$1.txt
дает тебе:
python3 curtailment_scaling.py '1 1 163'
и ты хочешь:
python3 curtailment_scaling.py 1 1 163
вы можете это сделать (версия > 20190722):
parallel --delay 0.2 -j 100 --joblog curtailment_scaling_remaining_$1.log --resume python3 scaling.py {=uq=} < missing_runs_$1.txt
( uq
выполняется uq();
, что приводит к тому, что строка замены не будет заключена в кавычки.)
или:
parallel --delay 0.2 -j 100 --joblog eval curtailment_scaling_remaining_$1.log --resume python3 scaling.py {} < missing_runs_$1.txt