【问题标题】:sending a complex shell command to python subprocess向 python 子进程发送复杂的 shell 命令
【发布时间】:2012-05-22 03:23:06
【问题描述】:

我正在编写一个脚本,该脚本在 python 中使用了一系列复杂的 Imagemagick 命令。 我想知道如何称呼这样的东西......

convert 1.png \( +clone -background black -shadow 110x1+9+9 \) +swap -background none -layers merge +repage 2.png

我很乐意用子进程调用简单的命令,但我还不知道如何指定执行顺序(转义括号)。

当然我可以使用 os.system 或 commands 模块,但由于这些都离开了语言,我肯定更喜欢使用 subprocess。

【问题讨论】:

    标签: python python-3.x subprocess python-2.7


    【解决方案1】:

    是的,您想使用subprocess。您只需将每个参数放在您提供给Popen 的参数列表中的单独项目中:

    subprocess.Popen(['convert', '1.png', '(', '+clone', '-background', 'black', '-shadow', '110x1+9+9',
                      ')', '+swap', '-background', 'none', '-layers', 'merge', '+repage', '2.png'],
                     otherargments=values, etc=etc)
    

    您也可以预先建立该参数列表,以防您的参数顺序需要更改。

    您不需要对参数进行任何转义(例如参数中的空格,或其他特殊的 shell 字符,如“(”和“)”),因为这不会被 shell 解释.

    【讨论】:

    • 它有效!我想我也可以使用 subprocess.call() 我没有意识到括号只会被 imagemagick 解释。
    • 是的,如果您在子进程运行时不需要做任何事情,那么 subprocess.call() 就可以了。很高兴我能帮上忙。