Spaces:
Running
Running
| """Safe subprocess wrappers for tool execution.""" | |
| from __future__ import annotations | |
| import subprocess | |
| from collections.abc import Sequence | |
| def run_command(argv: Sequence[str]) -> subprocess.CompletedProcess[str]: | |
| """Run a subprocess safely (no shell) and return completed process.""" | |
| return subprocess.run( # noqa: S603 | |
| list(argv), | |
| check=True, | |
| capture_output=True, | |
| text=True, | |
| shell=False, | |
| ) | |
| def run_command_allow_fail(argv: Sequence[str]) -> subprocess.CompletedProcess[str]: | |
| """Run a subprocess safely without raising on non-zero exit.""" | |
| return subprocess.run( # noqa: S603 | |
| list(argv), | |
| check=False, | |
| capture_output=True, | |
| text=True, | |
| shell=False, | |
| ) | |
| def spawn_background(argv: Sequence[str]) -> subprocess.Popen[bytes]: | |
| """Start a long-running daemon process (fire-and-forget, no shell).""" | |
| return subprocess.Popen( # noqa: S603 | |
| list(argv), | |
| stdout=subprocess.DEVNULL, | |
| stderr=subprocess.DEVNULL, | |
| shell=False, | |
| ) | |