auto_build_launcher/utils/command_utils.py

72 lines
2.1 KiB
Python
Raw Permalink Normal View History

2025-07-07 03:27:26 +00:00
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