【发布时间】:2016-09-20 12:57:56
【问题描述】:
我有一个 python 应用程序,它有一个 shell,需要根据它运行的 shell 是 Windows Command Prompt (cmd) 还是 Powershell 来进行一些设置。
我无法弄清楚如何检测应用程序是否在powershell 或cmd 中运行。
根据我在 stackoverflow 和 Google 上的搜索,似乎唯一的方法是使用 psutil 查找父进程的名称。
有更好的方法吗?
编辑: 我决定使用psutil 来查找父进程的名称。感谢所有在 cmets 中提供帮助的人。
【问题讨论】:
-
在这种情况下,您可以尝试一个您知道只能在 Powershell 中工作的命令并检查错误。否则,这确实是 Python 问题,而不是 powershell 问题。您可以在 python 中为您的进程查询 Win32_Process 类。然后获取父进程的PID并查询该进程以查看它是什么。
-
让shell独立于启动shell怎么样?添加一个提供两个 shell 的菜单,以便用户决定是 cmd 还是 psh 更合适。
-
我认为
psutil是您的最佳选择。您的 Python 脚本由 Python 解释器运行,无论它是从 PowerShell 还是 CMD 进程启动的。 -
您的脚本未在 in cmd.exe 或 powershell.exe 中运行。如果它由 python.exe 执行,则它附加到由 conhost.exe 实现的控制台窗口,与 cmd.exe 或 powershell.exe 无关。 Python 的
os.system使用 cmd.exe。subprocess模块使用 WinAPICreateProcess,它使用 PE 可执行文件(即 .EXE,但扩展名无关紧要)创建一个进程,或者在将路径传递给 .BAT 或 .CMD 文件时启动 cmd.exe。 subprocess 的shell=True选项使用%ComSpec%shell,通常是cmd.exe。 -
此问题的所有现有答案在功能上都是无用的。 此外,OP 未能详细说明他们如何在问题编辑中利用第三方
psutil包。相反,请参阅 this genuinely useful answer 到 similar question elsewhere。 tl;dr:is_powershell = bool(re.fullmatch('pwsh|pwsh.exe|powershell.exe', psutil.Process(os.getppid()).name())).
标签: python windows powershell cmd