You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python subprocess.Popen调用gpsmon后C二进制程序输出缩进异常

根因分析
  1. C程序输出未被拦截:当前代码仅重定向了子进程的标准输出流(stdout),绝大多数后台/嵌入式C程序会将运行结果、日志输出到标准错误流(stderr),未对该流做重定向时,其内容会直接输出到当前终端。
  2. 输出格式错位:gpsmon是基于ncurses的终端交互工具,启动时会修改当前控制终端的默认属性,包括关闭换行自动补全回车的ONLCR标记,此时终端输出遇到\n仅会下移一行,不会回到行首,就会出现阶梯状缩进。即使gpsmon的输出被重定向到/dev/null,它仍然会修改当前关联终端的属性,且运行时或退出时未正常重置属性,导致后续程序的输出格式受影响。
解决方案

1. 补全子进程输出重定向规则

启动两个子进程时,同时对stdout和stderr做重定向,彻底拦截所有输出到终端的内容,同时隔离gpsmon的终端控制权限:

# gpsmon 启动代码修改
cmd = "gpsmon -n 10.3.1.254:2947 -l output.txt"
gpsmonitor_cmd = subprocess.Popen(
    cmd.split(),
    stdout = subprocess.DEVNULL,
    stderr = subprocess.DEVNULL,
    start_new_session = True # 隔离终端控制权限,避免gpsmon修改当前终端属性
)
# C二进制程序启动代码修改
process = subprocess.Popen(
    createBinaryCommand,
    stdout=subprocess.DEVNULL,
    stderr=subprocess.DEVNULL
)

start_new_session=True参数会让gpsmon在新的会话中启动,不再关联当前控制终端,也就无法修改当前终端的属性,从根源避免输出格式被篡改。

2. 兜底重置方案

如果上述配置后仍出现格式错位问题,可在启动C二进制程序前,手动重置终端属性为默认状态:

# 启动C程序前执行,重置终端属性
subprocess.run(["stty", "sane"], capture_output=True)

内容的提问来源于stack exchange,提问作者Elliott Goldstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:45:01