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

标签 python shell powershell

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

最佳答案

一般环境变量SHELL不会告诉你哪个 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 平台)之外完全没有预定义
  • 或者必须在 PowerShell 之外只有一两个条目(Windows,通过注册表预定义)[1]。

  • 它假定脚本不是通过嵌套的 shell 调用调用的:
  • 如果您从 PowerShell 启动了不同的 shell,然后启动了您的脚本,则下面的解决方案仍将指示您的脚本是由 PowerShell 启动的。
  • 相反,如果您启动 wsl.exe或 WSL 的 bash.exe或 MSYS' bash.exe/sh.exe从随后启动您的脚本的 PowerShell 中,以下解决方案不会表明该脚本是由 PowerShell (间接)启动的,因为这些可执行文件不继承调用者的环境变量;相比之下,bash.exe/sh.exe Git 自带的,Cygwin 自带的。

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

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

    关于python - 在python中检测当前shell是否是powershell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57516896/

    相关文章:

    python - 使用 Pillow 将图像转换为 webP

    当提供 -w 参数时,python 2to3 不会更改 Huey 文件

    bash - 使用 bash 命令打印文件特定部分的最快方法

    regex - Powershell Replace中的Escape Tilde

    powershell - 使用 powershell 在注册表中编辑 CurrentControlSet

    python - 表单中的 Django 文本未翻译

    python - 如何使用 mysql-connector 检索日期时间值?

    linux - 是否可以对 STDOUT 进行分页?

    java - Jar 完成后退出进程

    powershell - 如何在PowerShell中的ACK中转义双引号和冒号