2016-11-04 53 views
2

我将一个有效的Python字典作为参数传递给我的Python脚本。这是一组实验的一部分,所以我的脚本将不得不在字典中多次启动并使用不同的值。我使用的是远程机器,所以我正在使用GNU Parallel,这在过去很好(我引用了论文:)。如何通过GNU Parallel将Python字典作为参数传递给脚本?

事情是,参数反复操作,所以我需要使用引号和反斜杠,使我的论点到达健全和安全。我的问题是:有没有更好的方法来做到这一点?

这是一个最小的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" 

你不写你的输入值如何棘手的是如果它们包含“或制表符,那么你需要额外的报价:

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 

现在,这意味着你不必担心字典中逸出值因为它最终会引用任何实际处理它的内容。

相关问题