Neh*_*ani 7 python shell powershell
检查我的python程序在哪个shell中运行的推荐方法是什么?我知道我可以查询os.environ.get('SHELL')
shell 名称,但是我可以使用什么来确定 powershell?
mkl*_*nt0 11
一般情况下,环境变量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))
Run Code Online (Sandbox Code Playgroud)
如果安装包不是一个选项,您可以使用以下解决方法来专门检测 PowerShell,但请注意限制:
它假定标准PowerShell 安装,特别是关于环境变量PSModulePath
:也就是说,PSModulePath
必须:
它假定脚本不是通过嵌套的shell 调用来调用的:
如果您从 PowerShell 启动了不同的 shell,然后该 shell 启动了您的脚本,下面的解决方案仍会表明您的脚本是由 PowerShell 启动的。
相反,如果您从 PowerShell启动wsl.exe
或 WSLbash.exe
或 MSYS' bash.exe
/ sh.exe
,然后启动您的脚本,下面的解决方案不会表明脚本是由 PowerShell(间接)启动的,因为这些可执行文件不继承调用者的环境变量;相比之下,Git附带的bash.exe
/和 Cygwinsh.exe
附带的/可以。
import os
isPowerShell = len(os.getenv('PSModulePath', '').split(os.pathsep)) >= 3
Run Code Online (Sandbox Code Playgroud)
请注意,当 PowerShell 启动时,它会确保在所有平台上至少存在3 个位置PSModulePath
(收件箱/系统模块位置、所有用户位置和当前用户位置)。如前所述,在 PowerShell 之外,该变量在 Unix 上根本没有预定义,而在 Windows 上,它最多预定义了 2 个位置。
[1] 较旧的 Windows 10 版本仅预定义了系统模块位置$env:SystemRoot\System32\WindowsPowerShell\v1.0\Modules
,而较新的版本还预定义了所有用户位置$env:ProgramFiles\WindowsPowerShell\Modules
。
归档时间: |
|
查看次数: |
922 次 |
最近记录: |