如何通过 GNU Parallel 将 Python 字典作为参数传递给脚本?
How can I pass a Python dictionary as argument to a script via 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}
有没有更漂亮的拼写字典的方法?
非常感谢您的帮助!
您可以通过执行以下操作将其减少到引用字符串开头和结尾的一些混乱:
parallel --header : python /tmp/test.py "'"'{"var1": {var1}, "var2": {var2}}'"'" ::: var1 2 ::: var2 1
现在这意味着您不必担心转义字典中的值,因为它最终会被单引号引用到实际处理它的任何内容。
函数是摆脱一些引用地狱的好方法:
myfunc() {
python example.py '{"var1": "'""'", "var2": "'""'"}'
}
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"
我正在将有效的 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}
有没有更漂亮的拼写字典的方法?
非常感谢您的帮助!
您可以通过执行以下操作将其减少到引用字符串开头和结尾的一些混乱:
parallel --header : python /tmp/test.py "'"'{"var1": {var1}, "var2": {var2}}'"'" ::: var1 2 ::: var2 1
现在这意味着您不必担心转义字典中的值,因为它最终会被单引号引用到实际处理它的任何内容。
函数是摆脱一些引用地狱的好方法:
myfunc() {
python example.py '{"var1": "'""'", "var2": "'""'"}'
}
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"