subprocess处理命令参数的规则实际上有点复杂。
从文档:
args应该是程序参数的序列,或者是单个字符串。默认情况下,执行程序中的第一项args,如果args是一个序列。如果args为字符串,则解释
取决于平台, 并在下面进行描述。有关默认行为的其他区别,请参见shell和executable参数。
除非另有说明,否则建议args按顺序传递。…如果shell为True,则建议args按字符串而不是顺序传递。
与
shell=False:
在Unix上,如果
args是字符串,则该字符串将解释为要执行的程序的名称或路径。但是,只有在不将参数传递给程序的情况下才能执行此操作。在Windows上,如果
args是序列,它将以Windows上将参数序列转换为字符串中所述的方式转换为字符串。这是因为底层CreateProcess()对字符串进行操作。
与
shell=True:
在with
shell=True的Unix上,shell默认为/bin/sh。如果args为字符串,则该字符串指定要通过外壳执行的命令。这意味着该字符串的格式必须与在shell提示符下键入时的格式完全相同。例如,这包括在文件名中使用引号或反斜杠转义。
如果args是序列,则第一项指定命令字符串,任何其他项都将被视为shell本身的其他参数。在Windows上
shell=True,COMSPEC环境变量指定默认外壳程序。shell=True在Windows上唯一需要指定的是将要执行的命令内置到外壳程序中(例如dir或copy)。您不需要shell=True运行批处理文件或基于控制台的可执行文件。
(全部为我的重点)



