我有一个python应用程序,它有一个shell,需要根据它运行的shell是Windows Command Prompt (cmd)还是Powershell进行一些设置。我还没能弄清楚如何检测应用程序是在powershell还是cmd中运行。从我在stackoverflow和Google上的搜索来看,似乎唯一的方法是使用psutil来查找父进程的名称。有更好的方法吗?
Windows Command Prompt (cmd)
Powershell
powershell
cmd
psutil
of1yzvn41#
@Matt A.说的对,使用psutil和os包获取父进程id和名称。
os
parent_pid = os.getppid() print(psutil.Process(parent_pid).name())
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'
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" }
2cmtqfgy4#
基于this post,您应该能够通过Python脚本中的subprocess模块运行此CMD/PS命令:
subprocess
subprocess.call("(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell", shell=True)
如果您在CMD中,则输出CMD;如果您在PS中,则输出PowerShell。
CMD
PowerShell
4条答案
按热度按时间of1yzvn41#
@Matt A.说的对,使用
psutil
和os
包获取父进程id和名称。ecr0jaav2#
下面的代码片段在bash/powershell中的args.file上找到md5 sum,我通常使用第一个命令来检查我们正在运行的是什么,所以我可以稍后使用它,在子进程中使用shell=True不是很便携。
jm81lzqq3#
下面是一个示例
powershell
存根,它可以做到这一点:2cmtqfgy4#
基于this post,您应该能够通过Python脚本中的
subprocess
模块运行此CMD/PS命令:如果您在CMD中,则输出
CMD
;如果您在PS中,则输出PowerShell
。