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
我该如何解决这个问题?
答案 0 :(得分:2)
Windows进程必须从传递给CreateProcess
的命令行解析自己的参数列表。相比之下,POSIX系统使用exec
和spawn
函数,这些函数采用已经解析的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
。