一、前置说明
在自动化过程中,经常需要在命令行中执行一些操作,比如启动应用、查杀应用等,因此可以封装成一个CommandExecutor来专门处理这些事情。
二、操作步骤
# cmd_util.pyimport logging
import os
import platform
import shutil
import subprocessimport psutillogger = logging.getLogger(__name__)class CommandExecutor:@staticmethoddef execute_command(command):"""subprocess.run() 方法用于执行命令并等待其完成,然后返回一个 CompletedProcess 对象,该对象包含执行结果的属性。它适用于需要等待命令完成并获取结果的情况。"""try:result = subprocess.run(command, shell=True, capture_output=True, text=True)if result.returncode == 0:return result.stdout.strip()else:return result.stderr.strip()except Exception as e:return str(e)@classmethoddef kill_processes_with_name(cls, name):"""查杀窗口名称包含 name 的所有进程,支持模拟匹配"""try:if platform.system() == 'Windows':# Windows系统使用tasklist和findstr命令来获取包含特定字符串的窗口进程列表command = f'tasklist /V /FO CSV | findstr /C:"{name}"'output = cls.execute_command(command)if output:# 遍历输出的进程列表for line in output.splitlines():# 解析进程信息process_info = line.split(",")process_name = process_info[0].strip('"')process_id = process_info[1].strip('"')# 先尝试关父进程,解决:关掉uiautomatorview或appium server 之后, 会留下一个无用的cmd的窗口try:# 获取父进程parent_process = psutil.Process(int(process_id)).parent()# 终止父进程(CMD窗口)kill_parent_command = f"taskkill /F /T /PID {parent_process.pid}"cls.execute_command(kill_parent_command)except:pass# 如果没有父进程,则直接关闭子进程;如果父进程已关闭,子进程会消失,也try catch 一下try:# 终止进程kill_command = f"taskkill /F /T /PID {process_id}"cls.execute_command(kill_command)# 记录日志logger.info(f"Stopped process '{process_name}' with ID '{process_id}'")except:passelse:logger.info(f"No processes found with window name containing '{name}'")else:# 其他操作系统使用wmctrl命令获取包含特定字符串的窗口列表command = f"wmctrl -l | grep {name}"window_list = cls.execute_command(command)if window_list:# 遍历输出的窗口列表for line in window_list.splitlines():# 解析窗口信息window_info = line.split()window_id = window_info[0]# 关闭窗口os.system(f"wmctrl -ic {window_id}")# 记录日志logger.info(f"Stopped processes with window name containing '{name}'")else:logger.info(f"No processes found with window name containing '{name}'")except Exception as e:logger.warning(f"Error: {str(e)}")cmd_executor = CommandExecutor()
cmd = cmd_executor
三、Demo验证
以关闭多开的两个夜神模拟器,来测试代码,顺利关闭:
if __name__ == '__main__':import logginglogging.basicConfig(level=logging.DEBUG)print(cmd.kill_processes_with_name('夜神'))
欢迎技术交流: