Python 查杀进程的方法封装
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('')