检查我的python程序在哪个shell中运行的推荐方法是什么?我知道我可以查询os.environ.get('SHELL')
的shell名称,但是我可以用什么来确定powershell?
答案 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 窗口:是)。