为了账号安全,请及时绑定邮箱和手机立即绑定

python中检测当前shell是否为powershell

python中检测当前shell是否为powershell

米琪卡哇伊 2022-01-05 10:56:16
检查我的python程序在哪个shell中运行的推荐方法是什么?我知道我可以查询os.environ.get('SHELL')shell 名称,但是我可以使用什么来确定 powershell?
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

一般情况下,环境变量SHELL也不会告诉你什么shell调用你的脚本,它只是告诉你当前用户的的二进制路径默认外壳(在类Unix平台),作为chepner笔记。


要检测哪个 shell 调用了您的脚本,您必须检查脚本的父进程。


以下适用于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,但请注意限制:

  • 假定标准PowerShell 安装,特别是关于环境变量PSModulePath:也就是说,PSModulePath必须:

    • 在 PowerShell 之外根本没有预定义(类 Unix平台)

    • 或者必须具有只是一个2项以外的PowerShell(视窗,通过注册表预定义)[1] 

  • 它假定脚本不是通过嵌套的shell 调用来调用的:

    • 如果您从 PowerShell 启动了不同的 shell,然后该 shell 启动了您的脚本,下面的解决方案仍会表明您的脚本是由 PowerShell 启动的。

    • 相反,如果您从 PowerShell启动wsl.exe或 WSLbash.exe或 MSYS' bash.exesh.exe,然后启动您的脚本,下面的解决方案不会表明脚本是由 PowerShell(间接)启动的,因为这些可执行文件不继承调用者的环境变量;相比之下,Git附带的bash.exe/和 Cygwinsh.exe附带的/可以。

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

请注意,当 PowerShell 启动时,它确保所有平台上的, 中至少存在3 个位置PSModulePath(收件箱/系统模块位置、所有用户位置和当前用户位置)。如前所述,在 PowerShell 之外,该变量在 Unix 上根本没有预定义,而在 Windows 上,它最多预定义了 2 个位置。


[1] 较旧的 Windows 10 版本仅预定义了系统模块位置$env:SystemRoot\System32\WindowsPowerShell\v1.0\Modules,而较新的版本预定义了所有用户位置$env:ProgramFiles\WindowsPowerShell\Modules


查看完整回答
反对 回复 2022-01-05
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

如果您不想依赖外部包,建议的 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 窗口:是)。


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信