2

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

这些命令的编写方式就像在终端/控制台中键入一样。为此,我使用Popen()shell=Trueso 来模仿某人在终端/控制台中输入的行为。

现在我想允许用户指定他喜欢的命令解释器。更准确地说,在 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)同时仍然尽我所能模仿它。

有什么想法吗 ?

4

1 回答 1

7

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

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

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

于 2013-09-07T16:13:33.710 回答