Как правило, переменная окружения SHELL
не не сообщает вам, какая оболочка вызвала ваш сценарий, она только сообщает вам двоичный путь оболочки по умолчанию текущего пользователя (в Unix-подобном)платформы), как отмечает chepner .
Чтобы определить, какая оболочка вызвала ваш сценарий, вы должны изучить родительский процесс сценария .
Следующее работает с установленным пакетом 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, в частности , но обратите внимание на ограничения :
It предполагает стандартную установку PowerShell , в частности, в отношении переменной среды PSModulePath
: то есть PSModulePath
не должно быть предопределено вообще вне PowerShell (Unix-подобные платформы) или должно иметь только одна запись (Windows, предопределенная через реестрry).
Предполагается, что скрипт не был вызван с помощью вложенных вызовов оболочки;в частности, если вы запустили другую оболочку из PowerShell, которая затем запустила ваш скрипт, приведенное ниже решение все равно будет указывать, что ваш скрипт был запущен PowerShell.
import os
isPowerShell = len(os.getenv('PSModulePath', '').split(os.pathsep)) >= 2
Подход основан натот факт, что PowerShell добавляет дополнительные каталоги к PSModulePath
при запуске, поэтому наличие в переменной нескольких каталогов означает, что сценарий (в конечном счете) был запущен из PowerShell.