【问题标题】:How to call Popen with a different shell?如何用不同的外壳调用 Popen?
【发布时间】:2013-09-11 13:48:00
【问题描述】:

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

这些命令的编写方式就像在终端/控制台中键入一样。为此,我使用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) 内部的“魔法”,同时仍然尽我所能模仿它。

有什么想法吗?

【问题讨论】:

    标签: python windows shell subprocess


    【解决方案1】:

    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使用的命令。

    【讨论】:

    • 使用 r"" 文字或转义斜杠 ("\b" != r"\b" == "\\b")。
    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多