Skip to content

Run a command and capture output

Execute a argv list and return status, stdout, and stderr.

18th August 2026

import os
from subprocess import PIPE, Popen
from typing import Any, List, NamedTuple


class ExecutionResult(NamedTuple):
    status: int
    stdout: str
    stderr: str


def execute_shell_command(cmd: List[str]) -> ExecutionResult:
    with Popen(cmd, stdout=PIPE, stderr=PIPE, cwd=os.getcwd()) as process:
        stdout_raw, stderr_raw = process.communicate()
        status: int | Any = process.returncode

    stdout = stdout_raw.decode('utf-8').rstrip()
    stderr = stderr_raw.decode('utf-8').rstrip()
    return ExecutionResult(status, stdout, stderr)