Files
FishServer/fish_api/app/subprocess_run.py

47 lines
1.4 KiB
Python
Raw Normal View History

2026-04-13 13:49:55 +08:00
"""子进程运行并把 stdout/stderr 合并;可选将逐行输出写入 loguru测量/行为推理可关闭以减少日志)。"""
from __future__ import annotations
import os
import subprocess
from typing import Dict, List, Optional
from loguru import logger
def run_subprocess_with_log(
cmd: List[str],
*,
cwd: str,
env: Optional[Dict[str, str]] = None,
log_name: str,
2026-04-13 13:49:55 +08:00
stream_to_logger: bool = True,
) -> subprocess.CompletedProcess[str]:
2026-04-13 13:49:55 +08:00
"""运行子进程,合并 stderr 到 stdout可选按行输出到 loguru。
返回 CompletedProcessstdout 为完整输出便于失败时拼进异常信息
2026-04-13 13:49:55 +08:00
``stream_to_logger=False`` 时不把子进程逐行写入日志仍完整收集 stdout
"""
proc = subprocess.Popen(
cmd,
cwd=cwd,
env=env if env is not None else os.environ.copy(),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
encoding="utf-8",
errors="replace",
bufsize=1,
)
lines: List[str] = []
if proc.stdout is not None:
for line in proc.stdout:
lines.append(line)
2026-04-13 13:49:55 +08:00
if stream_to_logger:
s = line.rstrip()
if s:
logger.info("[{}] {}", log_name, s)
rc = proc.wait()
out = "".join(lines)
return subprocess.CompletedProcess(cmd, rc, out, "")