我正在编写一个带有一系列命令并执行它们的工具。
命令的写入方式与在终端/控制台中键入的命令类似。为此,我将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)
内部的“魔法”,同时尽可能地模仿它。
有什么想法吗?
答案 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>