windows 如何检测我的python代码是在PowerShell还是命令提示符(cmd)中运行

vu8f3i0k  于 2023-04-13  发布在  Windows
关注(0)|答案(4)|浏览(202)

我有一个python应用程序,它有一个shell,需要根据它运行的shell是Windows Command Prompt (cmd)还是Powershell进行一些设置。
我还没能弄清楚如何检测应用程序是在powershell还是cmd中运行。
从我在stackoverflow和Google上的搜索来看,似乎唯一的方法是使用psutil来查找父进程的名称。
有更好的方法吗?

of1yzvn4

of1yzvn41#

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

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

ecr0jaav2#

下面的代码片段在bash/powershell中的args.file上找到md5 sum,我通常使用第一个命令来检查我们正在运行的是什么,所以我可以稍后使用它,在子进程中使用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'
jm81lzqq

jm81lzqq3#

下面是一个示例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"
}
2cmtqfgy

2cmtqfgy4#

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

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

如果您在CMD中,则输出CMD;如果您在PS中,则输出PowerShell

相关问题