import subprocess from typing import Union, Tuple from .system_utils import SystemUtils class CommandUtils: """命令执行工具类""" @staticmethod def execute(command: Union[str, list], timeout: int = None) -> Tuple[int, str, str]: """ 执行系统命令并返回结果(兼容Windows/macOS/Linux) 参数: command: 要执行的命令,可以是字符串或列表 timeout: 超时时间(秒) 返回: 元组: (return_code, stdout, stderr) """ # 预处理命令 processed_cmd = CommandUtils._prepare_command(command) try: # 执行命令 result = subprocess.run( processed_cmd, shell=isinstance(command, str), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, timeout=timeout ) return result.returncode, result.stdout, result.stderr except subprocess.TimeoutExpired: return -1, "", "Command timed out" except Exception as e: return -1, "", str(e) @staticmethod def _prepare_command(command: Union[str, list]) -> Union[str, list]: """预处理命令""" if SystemUtils.is_windows() and isinstance(command, str): return ['cmd', '/c'] + command.split() return command @staticmethod def execute_with_real_time_output(command: Union[str, list], timeout: int = None) -> int: """ 执行命令并实时输出(不捕获输出,直接打印到控制台) 参数: command: 要执行的命令 timeout: 超时时间(秒) 返回: 返回状态码 """ processed_cmd = CommandUtils._prepare_command(command) try: result = subprocess.run( processed_cmd, shell=isinstance(command, str), timeout=timeout ) return result.returncode except subprocess.TimeoutExpired: return -1 except Exception as e: return -1