auto_build_launcher/utils/command_utils.py

72 lines
2.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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