具有等号和空格的Python子进程参数

时间:2017-03-25 22:28:45

标签: python shell subprocess

我正在尝试使用subprocess.check_output运行命令而不使用shell=True关键字参数。我的命令是:

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

,是否有正确的方法可以做到这一点

2 个答案:

答案 0 :(得分:6)

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

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

将数组传递给subprocess.check_output()时,您已将命令划分为子进程的参数。因此,您不需要围绕“带空格的东西”的引号。也就是说,您不需要逃离空间。更确切地说,引号正如你在结果片段中所显示的那样引用:

y

到现在为止,我希望你已经猜到了正确的答案。 Spoiler提前:

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

答案 1 :(得分:0)

除了@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}}\""