gpt4 book ai didi

python - 检测当前shell是否为python中的powershell

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:46 25 4
gpt4 key购买 nike

检查哪个 shell 是我的 python 程序在里面运行的推荐方法是什么?我知道我可以在 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/ PowerShell 的 sh.exe,然后启动您的脚本,下面的解决方案表明该脚本是由 PowerShell(间接)启动的,因为这些可执行文件不继承调用者的环境变量;相比之下,Git 和 Cygwin 自带的 bash.exe/sh.exe 可以。

import os

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

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


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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com