我正在开发一个命令行应用程序,用于启动具有预生成环境的子shell。
subprocess.call(subshell, shell=True, env=custom_environment)
启动subshell.bat
或subshell.sh
,具体取决于当前操作系统。
subshell = "subshell.bat" if os.name == "nt" else "subshell.sh"
但我希望支持Cygwin,Git Bash和其他在Windows上运行的人,并且他们每个都需要被subshell.sh
代替,即使操作系统是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问题的措辞完全相同,但并不涉及类似的问题,因此向其添加不相关的问题并不合适。
答案 0 :(得分:2)
您可以使用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()
获取流程的名称。
答案 1 :(得分:1)
如果您不能仅仅依靠检查操作系统,我建议添加命令行参数来指示版本。它可能会使程序更多" Pythonic"因为'明确胜过隐含'。