如何在windows上使用带引号的参数调用subprocess.check_call?

时间:2014-11-25 16:37:20

标签: python subprocess

subprocess.check_call(["C:\\cygwin\\bin\\bash", "-c", '"echo hello; echo goodbye"'], shell=True)
在Windows上

,返回:

/usr/bin/bash: echo hello; echo goodbye: command not found

然而,跑步:

C:\cygwin\bin\bash -c "echo hello; echo goodbye"

给出预期的输出:

hello
goodbye

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

Windows进程必须从传递给CreateProcess的命令行解析自己的参数列表。相比之下,POSIX系统使用execspawn函数,这些函数采用已经解析的argv数组。

在Windows上,subprocess.Popen调用subprocess.list2cmdline将列表转换为命令行字符串。这假定为VC++ parsing rules,因此字面引号字符将转义为\"。如果Cygwin使用VC ++中的不同规则,只需将args作为字符串而不是列表传递。例如:

subprocess.check_call(r'C:\cygwin\bin\bash -c "echo hello; echo goodbye"')

您还可以明确提供可执行文件。

subprocess.check_call('bash -c "echo hello; echo goodbye"', 
                      executable=r'C:\cygwin\bin\bash.exe')

它作为CreateProcess参数传递给lpApplicationName