我正在编写一个接受一系列命令并执行它们的工具。
命令的编写方式就像在终端/控制台中输入的一样。为此,我使用了 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)
中重新实现“魔法”,同时仍然尽我所能模仿它。
有什么想法吗?
最佳答案
shell=True
几乎普遍都是错误的,这里也不异常(exception)。在这种情况下,your_command
是为 bash 解析而构建的字符串,使用:
subprocess.Popen([r'C:\Program Files (x86)\Git\bin\bash.exe', "-c", your_command])
...并且该命令将仅由指定的 shell(Git 提供的 shell)解析,而不需要由 COMSPEC
的 shell 解析以生成命令供庆典。
关于python - 如何用不同的 shell 调用 Popen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18675073/