默认情况下subprocess.call
不使用 shell ( shell=False
)。因此,没有必要逃避这些空间。shell 中需要空格转义(因为 shell 需要知道二进制文件的名称和参数是什么)。因此,以下用法都是正确的(并且相似):
不产生产生子进程的外壳(有利):
from subprocess import call
call('/Applications/BitRock InstallBuilder for Qt 8.5.2/bin/Builder.app/Contents/MacOS/installbuilder.sh')
或再次没有外壳(显式shell=False
和参数列表的使用)
from subprocess import call
call(['/Applications/BitRock InstallBuilder for Qt 8.5.2/bin/Builder.app/Contents/MacOS/installbuilder.sh'],
shell=False)
但是,当subprocess
被告知首先生成子进程本身的 swawn shell 时,必须转义空格,因为它是一个 shell 命令:
from subprocess import call
call('/Applications/BitRock\\ InstallBuilder\\ for\\ Qt 8.5.2/bin/Builder.app/Contents/MacOS/installbuilder.sh',
shell=True)
另一种方法是使用外壳和引号:
from subprocess import call
call('"/Applications/BitRock InstallBuilder for Qt 8.5.2/bin/Builder.app/Contents/MacOS/installbuilder.sh"',
shell=True)
我建议尽可能不要使用 shell(主要是出于安全原因),但请记住,list
如果您不使用 shell,则必须将参数传递给命令。
要么(没有外壳,有利):
call(['/bin/echo', 'foo', 'bar'])
或带壳
call('/bin/echo foo bar', shell=True)
(两个调用具有相同的输出 ( foo bar\n
)