python - 如何用不同的 shell 调用 Popen?

标签 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) 中重新实现“魔法”,同时仍然尽我所能模仿它。

有什么想法吗?

最佳答案

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/

相关文章:

java - 从 Java 调用 python 脚本时获取输出的问题

python - Google Admin SDK 错误资源未找到 : domain when trying to list existing users

windows - 在 Windows 7 上安装 Haskell 模块

windows - SourceTree Windows Mercurial - 重新打开关闭的分支

python - .7z 文件是否有等效的 gzip.open()?

linux - linux 中的 wc -c 是如何工作的?

regex - Bash——重命名文件

Linux 和 SVN : Need a shelll script to transfer updated files to test server after making an svn update

python - 在 sqlalchemy 中动态生成过滤器,混合使用 and/or 和 not/like

python - 如何键入提示具有封闭类类型的方法?