在 Python 中确定调用可执行文件

Determine calling executable in Python

我正在开发一个命令行应用程序,它使用预生成的环境启动子shell。

subprocess.call(subshell, shell=True, env=custom_environment)

它启动 subshell.batsubshell.sh 取决于当前 os。

subshell = "subshell.bat" if os.name == "nt" else "subshell.sh"

但我希望在 Windows 上支持 Cygwin、Git Bash 和其他 运行,他们每个人都需要 subshell.sh相反,即使 OS 是 Windows.

我想如果有一种方法可以确定 Python 进程的调用可执行文件,我可以改为检查它。

if calling_executable in ("bash", "sh"):
  subshell = "subshell.sh"
elif calling_executable in ("cmd", "powershell"):
  subshell = "subshell.bat"
else:
  sys.exit()  # unsupported shell

但我不确定该怎么做。关于如何以不同的方式处理它有什么想法或建议吗?

用法示例

$ mytool --enter
Entering subshell for bash.exe

ps。 this 问题措辞完全相同,但不涉及类似问题,因此在其中添加不相关的问题感觉不对。

如果您不能仅仅依靠检查操作系统,我建议您添加命令行参数来指示版本。它可能会使程序更多 "Pythonic" 因为 'explicit is better than implicit'.

Python Docs argparse

您可以使用 psutil 来做到这一点。

import psutil, os
Parent=psutil.Process(os.getpid()).parent()
ParentName=Parent.name() # e.g. bash, cmd.exe, etc

参见 that answer 的另一个例子。您也可以使用 psutil.Process(os.getpid()).parent().name() 获取进程的名称。