【问题标题】:How do I detect if my python code is running in PowerShell or the Command Prompt (cmd)如何检测我的 python 代码是否在 PowerShell 或命令提示符 (cmd) 中运行
【发布时间】:2016-09-20 12:57:56
【问题描述】:

我有一个 python 应用程序,它有一个 shell,需要根据它运行的 shell 是 Windows Command Prompt (cmd) 还是 Powershell 来进行一些设置。

我无法弄清楚如何检测应用程序是否在powershellcmd 中运行。

根据我在 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 模块使用 WinAPI CreateProcess,它使用 PE 可执行文件(即 .EXE,但扩展名无关紧要)创建一个进程,或者在将路径传递给 .BAT 或 .CMD 文件时启动 cmd.exe。 subprocess 的shell=True 选项使用%ComSpec% shell,通常是cmd.exe。
  • 此问题的所有现有答案在功能上都是无用的。 此外,OP 未能详细说明他们如何在问题编辑中利用第三方 psutil 包。相反,请参阅 this genuinely useful answersimilar question elsewheretl;dr: is_powershell = bool(re.fullmatch('pwsh|pwsh.exe|powershell.exe', psutil.Process(os.getppid()).name())).

标签: python windows powershell cmd


【解决方案1】:

基于this post,您应该可以通过 Python 脚本中的subprocess 模块运行此 CMD/PS 命令:

subprocess.call("(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell", shell=True)

如果你在 CMD 中,这将输出 CMD,如果你在 PS 中,则输出 PowerShell

【讨论】:

  • callPopen 显然调用 cmd.exe 来执行,而不是调用父 shell。因此,即使从 PowerShell 中启动 python,此命令也会返回 CMD 作为答案。
  • 不知道有没有办法设置Python调用什么样的shell?
【解决方案2】:

下面的sn-p在bash/powershell的args.file上找到md5sum,我一般用第一个命令来检查我们在运行什么,所以以后可以用,在子进程中使用shell=True不是很便携。

import os, subprocess
running_shell = None
mycheck='/usr/bin/md5sum'   # full path is needed
if not os.path.isfile(mycheck):
    try:
        file_md5sum = subprocess.check_output("powershell.exe Get-FileHash -Algorithm MD5 {} | Select -expand Hash".format(args.file).split())
    except FileNotFoundError as e:
        log.fatal("unable to generate md5sum")
        sys.exit(-1)
    file_md5sum = file_md5sum.lower()
    running_shell = 'powershell'
else:
    file_md5sum = subprocess.check_output([mycheck, args.file])
    running_shell = 'bash'

【讨论】:

    【解决方案3】:

    @Matt A. 是对的。使用psutilos包获取父进程id和名称。

    parent_pid = os.getppid()
    print(psutil.Process(parent_pid).name())
    

    【讨论】:

    • 如果从 iPython 运行会失败
    【解决方案4】:

    这是一个示例 powershell 存根,可以解决问题:

    $SCR="block_ips.py"
    $proc = $null
    $procs = Get-WmiObject Win32_Process -Filter "name = 'python3.exe' or name = 'python.exe'" | Select-Object Description,ProcessId,CommandLine,CreationDate
    
    $procs | ForEach-Object { 
        if ( $_.CommandLine.IndexOf($SCR) -ne -1 ) { 
            if ( $null -eq $proc ) {
                $proc = $_
            }
        }
    }
    
    if ( $null -ne $proc ) {
        Write-Host "Process already running: $proc"
    } else {
        Write-Host "$SCR is not running"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2018-05-10
      • 2015-08-26
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2015-05-20
      相关资源
      最近更新 更多