2016-11-04 1 views
2

Я передаю действительный словарь Python в качестве аргумента моему сценарию на Python. Это часть набора экспериментов, поэтому мой скрипт должен запускаться несколько раз и с разными значениями в словаре. Я использую удаленные машины, поэтому я прибегаю к GNU Parallel, который хорошо мне помог в прошлом (да, я привел статью :).Как передать словарь Python в качестве аргумента скрипту через GNU Parallel?

Дело в том, что аргументы меняются многократно, поэтому мне нужно использовать кавычки и обратную косую черту, чтобы заставить мой аргумент получить звук и безопасность. Мой вопрос: есть ли лучший способ сделать это?

Это минимальный сценарий Python:

import ast 
import sys 
print(sys.argv[1]) 
print(ast.literal_eval(sys.argv[1])) 

Если я запускаю следующую команду я получить желаемый результат:

parallel --header : python example.py '\{\"var1\":\ {var1},\ \"var2\":\ {var2}\}' ::: var1 1 ::: var2 2 

Выход:

{"var1": 1, "var2": 2} 
{'var1': 1, 'var2': 2} 

Есть похорошела способ изложить словарь?

Я очень благодарен за любую помощь!

ответ

0

функции являются хорошим способом избавиться от некоторых из котировальный-ад:

myfunc() { 
    python example.py '{"var1": "'"$1"'", "var2": "'"$2"'"}' 
} 
export -f myfunc 

parallel --header : myfunc ::: var1 "1st var" ::: var2 "2nd var" 

-q также может помочь (но ограничивает вас есть один оператор (нет составленных команд или переназначения):

parallel -qv --header : python example.py '{"var1": "{var1}", "var2": "{var2}"}' ::: var1 "1st var" ::: var2 "2nd var" 

вы не пишете, насколько сложно ваши входные значения, если они содержат "или TAB, то вам необходимо дополнительное процитировать:.

parallel --colsep '\n' -qv --header : python example.py '{"var1": "{=1 $_=Q($_) =}", "var2": "{=2 $_=Q($_) =}"}' ::: var1 "1st\"\$#<TABHERE>var" ::: var2 "2nd var" 
0

Вы можете уменьшить его в какой-то бардак в начале и в конце вашей строки в кавычках, выполнив следующие действия:

parallel --header : python /tmp/test.py "'"'{"var1": {var1}, "var2": {var2}}'"'" ::: var1 2 ::: var2 1 

Это означает, что теперь вам не придется беспокоиться о побеге значения в Словаре поскольку он заканчивается одиночным цитированием того, что на самом деле его обрабатывает.

Смежные вопросы