我正在尝试使用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
答案 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}}\""