我有一个python应用程序,它有一个shell,需要根据它运行的shell是Windows Command Prompt (cmd)
还是Powershell
进行一些设置。
我无法弄清楚如何检测应用程序是否在powershell
或cmd
中运行。
从我在stackoverflow和Google上的搜索,似乎唯一的方法是使用psutil
来查找父进程的名称。
有更好的方法吗?
编辑:我决定使用psutil
来查找父进程的名称。感谢所有在评论中提供帮助的人。
答案 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.是正确的。使用psutil
和os
包获取父进程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"
}