检查我的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 的解决方法 ,但请注意 约束 :
PSModulePath
:即PSModulePath
必须: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/