在python中检测当前shell是否为powershell

时间:2019-04-09 16:58:41

标签: python shell powershell

检查我的python程序在哪个shell中运行的推荐方法是什么?我知道我可以查询os.environ.get('SHELL')的shell名称,但是我可以用什么来确定powershell?

2 个答案:

答案 0 :(得分:2)

通常,环境变量SHELL不会告诉您什么shell调用了您的脚本,它仅告诉您当前用户的 default shell的二进制路径( chepner指出,在类似Unix的平台上。

要检测什么外壳程序调用了脚本,必须检查脚本的父进程

以下内容适用于安装了psutil软件包(既兼容v2,又兼容v3):

import os, psutil, re

# Get the parent process name.
pprocName = psutil.Process(os.getppid()).name()

# See if it is Windows PowerShell (powershell.exe) or PowerShell Core (pwsh[.exe]):
isPowerShell = bool(re.fullmatch('pwsh|pwsh.exe|powershell.exe', pprocName))

如果无法安装软件包,则可以使用以下变通办法专门检测PowerShell ,但请注意约束:< / p>

  • 假定安装了标准的PowerShell ,特别是针对环境变量PSModulePath:也就是说,PSModulePath绝对不能在PowerShell外部进行预定义(类似于Unix的平台)或必须只有一个 项(Windows,通过注册表预定义)。

  • 假定脚本不是通过 nested shell调用来调用的;具体来说,如果您启动了与PowerShell不同的Shell,然后又启动了脚本,则下面的解决方案仍将指示您的脚本是由PowerShell启动的。

import os

isPowerShell = len(os.getenv('PSModulePath', '').split(os.pathsep)) >= 2

该方法依赖于这样的事实,即PowerShell在启动时会向PSModulePath添加其他目录,因此变量中存在多个目录意味着该脚本(最终)是从以下位置启动的PowerShell。

答案 1 :(得分:0)

如果您不想依赖外部包,建议的 PSModulePath 检查在 Windows 上不能可靠地工作,它会为 cygwin、git bash 和 WSL 提供误报。

然而,powershell 窗口和 cmd 窗口的共同点是它们都将环境变量 PROMPT 设置为 $P$G(80 年代 DOS 的默认值)。因此以下作品

import os
isCmdOrPowershell = (os.getenv('PROMPT', '') == '$P$G')

例如作为终端是否支持 ANSI 颜色的可靠测试(cmd 和 powershell 窗口:否。cygwin、git bash 和 WSL 窗口:是)。