【问题标题】:How can I pass a Python dictionary as argument to a script via GNU Parallel?如何通过 GNU Parallel 将 Python 字典作为参数传递给脚本?
【发布时间】:2016-11-04 07:52:09
【问题描述】:

我将一个有效的 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}

有没有更好的拼写字典的方法?

非常感谢您的帮助!

【问题讨论】:

    标签: python bash gnu-parallel


    【解决方案1】:

    函数是摆脱一些引用地狱的好方法:

    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"
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 2016-08-06
        • 2022-01-04
        相关资源
        最近更新 更多