如何用不同的shell调用Popen?

ere*_*eOn 2 python windows shell subprocess

我正在编写一个工具,它接受一系列命令并执行它们.

如果在终端/控制台中键入命令,则写入命令.要做到这一点,我用Popen()shell=True来模仿某人在终端/控制台中输入的行为.

现在我想让用户指定他喜欢的命令解释器.更准确地说,在Windows上,可以决定使用其"Git bash"而不是cmd.exe.

根据Popen()文档,要使用的解释器的选择是通过环境变量完成的COMSPEC.

我试图在调用之前设置COMSPECC:\Program Files (x86)\Git\bin\bash.exe,但它失败了,因为subprocess会添加/c到命令中,而base期望-c.

我想不使用,shell=True但后来我不知道到底有什么区别:

  • 我应该.split()把命令行变成参数吗?如果是这样,怎么样?
  • 是否有任何shell=True暗示/设定的标志?

这里的目标是不重新实现内部的"魔力" Popen(shell=True) while still mimicking it the best I can.

有什么想法吗 ?

Cha*_*ffy 7

shell=True几乎普遍是错误的,这在这里没有什么不同.在这种情况下,where your_command是为bash解析而构建的字符串,请使用:

subprocess.Popen([r'C:\Program Files (x86)\Git\bin\bash.exe', "-c", your_command])
Run Code Online (Sandbox Code Playgroud)

...并且该命令将仅由指定的shell(由Git提供的shell)解析,而不是需要由shell解析COMSPEC以生成供bash使用的命令.