如何用不同的shell调用Popen?

时间:2013-09-07 15:49:17

标签: python windows shell subprocess

我正在编写一个带有一系列命令并执行它们的工具。

命令的写入方式与在终端/控制台中键入的命令类似。为此,我将Popen()shell=True一起使用,以便模仿某人在终端/控制台中输入的行为。

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

根据Popen()'s documentation,要使用的解释器的选择是通过环境变量COMSPEC完成的。

我尝试在调用之前将COMSPEC设置为C:\Program Files (x86)\Git\bin\bash.exe,但它失败了,因为子进程将/c添加到命令,而base期望-c

我想过没有使用shell=True,但后来我不确切地知道它们的区别是什么:

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

这里的目标是不再重新实现Popen(shell=True)内部的“魔法”,同时尽可能地模仿它。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

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

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

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