如何告诉我的python代码在PowerShell或命令提示符(cmd)中运行

时间:2016-05-23 15:06:00

标签: python windows powershell cmd

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

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

从我在stackoverflow和Google上的搜索,似乎唯一的方法是使用psutil来查找父进程的名称。

有更好的方法吗?

编辑:我决定使用psutil来查找父进程的名称。感谢所有在评论中提供帮助的人。

4 个答案:

答案 0 :(得分:0)

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

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

如果您使用CMD,它将输出CMD,如果您使用PS,则将输出PowerShell

答案 1 :(得分:0)

以下代码片段在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'

答案 2 :(得分:0)

@Matt A.是正确的。使用psutilos包获取父进程ID和名称。

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

答案 3 :(得分:0)

以下是一个可以解决问题的示例 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"
}