Python 查杀进程的方法封装

时间:2025-05-13 08:34:57
import os import platform import logging import shutil import subprocess import time import psutil import win32gui import win32process logger = logging.getLogger(__name__) class ProcessManager: @staticmethod def find_pid_by_window_name(window_name): """ 根据窗口名称查找对应的进程ID列表 """ pids = [] # 存储找到的进程ID列表 system = platform.system() # 获取操作系统类型 if system == "Windows": # 使用 win32gui 库查找窗口 def callback(hwnd, hwnd_list): try: if win32gui.IsWindowVisible(hwnd): # 检查窗口是否可见 window_text = win32gui.GetWindowText(hwnd) # 获取窗口标题文本 if window_name.lower() in window_text.lower(): # 如果窗口标题包含指定的窗口名称(不区分大小写) _, pid = win32process.GetWindowThreadProcessId(hwnd) # 获取窗口对应的进程ID hwnd_list.append(pid) # 将进程ID添加到列表中 except: pass return True win32gui.EnumWindows(callback, pids) # 枚举所有窗口,并调用回调函数进行查找 else: # 在 macOS 和 Linux 上使用 psutil 库查找进程 PID for proc in psutil.process_iter(['pid', 'name']): # 遍历所有进程,并获取进程的PID和名称 try: process_name = proc.info['name'].lower() # 获取进程名称(转换为小写) if window_name.lower() in process_name: # 如果进程名称包含指定的窗口名称(不区分大小写) pids.append(proc.info['pid']) # 将进程ID添加到列表中 except (psutil.NoSuchProcess, psutil.AccessDenied): pass return pids @staticmethod def find_pid_by_port(port): """ 根据端口号查找对应的进程ID列表 """ pids = [] for conn in psutil.net_connections(): try: if conn.laddr.port == port: pids.append(conn.pid) except (psutil.NoSuchProcess, psutil.AccessDenied): pass return pids @staticmethod def find_pid_by_process_name(process_name): """ 根据进程名称查找对应的进程ID列表 """ pids = [] for proc in psutil.process_iter(['pid', 'name']): try: if process_name.lower() in proc.info['name'].lower(): pids.append(proc.info['pid']) except (psutil.NoSuchProcess, psutil.AccessDenied): pass return pids def kill_process_by_pid(self, pid): """ 根据进程PID查杀进程。 此方法是 kill_process_by_port、kill_process_by_name、kill_process_by_window_name 的底层方法。 """ try: process = psutil.Process(pid) process.kill() logger.debug(f"Killed process with PID {process.pid}") # 杀死进程时,可能会遇到权限等问题 except Exception as e: logger.debug(f"Failed to kill process: {e}") def kill_process_by_port(self, port): """ 根据端口号,查杀进程 """ pids = self.find_pid_by_port(int(port)) for pid in pids: self.kill_process_by_pid(pid) def kill_process_by_name(self, process_name): """ 根据进程名,查杀进程 """ pids = self.find_pid_by_process_name(process_name) for pid in pids: self.kill_process_by_pid(pid) def kill_process_by_window_name(self, window_name): """ 根据窗口名称,查杀进程 """ pids = self.find_pid_by_window_name(window_name) for pid in pids: self.kill_process_by_pid(pid) process_manager = ProcessManager() if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) # 按窗口名称查杀 uiautomatorviewer process_manager.kill_process_by_window_name('automator') # 按端口号杀进 appium process_manager.kill_process_by_port(4723) # 按进程名称查杀夜神模拟器 process_manager.kill_process_by_name('')