如何通过GNU Parallel将Python字典作为参数传递给脚本?

时间:2016-11-04 07:52:09

标签: python bash gnu-parallel

我将有效的 Python字典作为参数传递给我的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}

有没有更简洁的方法拼出字典?

我非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

通过执行以下操作,您可以在引用字符串的开头和结尾处将其减少到一些混乱:

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

现在这意味着您不必担心转义dict中的值,因为它最终会引用实际处理它的任何内容。

答案 1 :(得分: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"