【问题标题】:Python subprocess argument with equal sign and space具有等号和空格的 Python 子进程参数
【发布时间】:2017-08-18 18:15:12
【问题描述】:

我试图在不使用 shell=True 关键字参数的情况下运行带有 subprocess.check_output 的命令。我的命令是这样的:

command --parameter="something with spaces"

有了这个:

subprocess.check_output(['command', '--parameter="something with spaces"'])

命令变成这样:

command "--parameter=\"something with spaces\""

还有这个:

subprocess.check_output(['command', '--parameter=', 'something with spaces'])

命令变成这个(=之后的空格):

command --parameter= "something with spaces"

有没有不使用shell=True的正确方法

【问题讨论】:

    标签: python shell subprocess


    【解决方案1】:

    以下是您需要了解的内容:

    空格用于分隔 shell 命令行上的参数。但是,如果您不使用 shell,则不需要转义空格。空格可以至少以两种方式转义(据我所知):使用引号(单引号或双引号)和反斜杠。

    当您将数组传递给 subprocess.check_output() 时,您已经将命令划分为子进程的参数。因此,您不需要“带空格的东西”周围的引号。也就是说,您不需要转义空格。相反,正如您在结果 sn-p 中显示的那样,引号被完全理解为引号:

    command "--parameter=\"something with spaces\""
    

    现在我希望你已经猜到正确答案是什么了。前方剧透:

    subprocess.check_output(['command', '--parameter=something with spaces'])
    

    【讨论】:

    • 我认为 command "--parameter=something with spaces" 不能在 shell 上工作,因为也引用了 --parameter,但它确实如此!谢谢
    【解决方案2】:

    添加到@Mark 的回答中,我特别需要将引号传递给程序以及将参数括起来的引号。基本上这就是我所需要的:

    make PAYOFF="\"{{0,1,-1},{-1,0,1},{1,-1,0}}\""
    

    Python 不会在最左边和最右边添加额外的引号,所以在等号前面添加一个空格就可以了。

    调用list2cmdline函数如下:

    subprocess.list2cmdline(['make', 'PAYOFF ="{{0,1,-1},{-1,0,1},{1,-1,0}}"'])
    

    会产生这个结果:

    make "PAYOFF =\"{{0,1,-1},{-1,0,1},{1,-1,0}}\""
    

    【讨论】:

      猜你喜欢
      • 2019-08-11
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2016-11-20
      • 2019-11-03
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多