"""Shell command execution.""" import subprocess from dataclasses import dataclass @dataclass class CommandResult: stdout: str stderr: str returncode: int @property def success(self) -> bool: return self.returncode == 0 def run(command: str, timeout: int = 30) -> CommandResult: """Run a shell command and return stdout, stderr, and returncode. The command is passed to the system shell (``shell=True``) so that shell built-ins, pipes, and redirections work as expected. """ def _decode(data: bytes) -> str: if not data: return "" for enc in ("utf-8", "gbk", "gb2312", "cp936", "latin1"): try: return data.decode(enc) except (UnicodeDecodeError, LookupError): continue return data.decode("utf-8", errors="replace") try: result = subprocess.run( command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=timeout, ) return CommandResult( stdout=_decode(result.stdout), stderr=_decode(result.stderr), returncode=result.returncode, ) except subprocess.TimeoutExpired as e: return CommandResult( stdout=_decode(e.stdout or b""), stderr=_decode(e.stderr or b""), returncode=-1, )