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

Python程序subprocess输出字节解码时卡住无响应如何解决

问题原因

  • JSON键名不匹配:你收到的请求报文里只有sendOutput字段,但代码中取值用的是req['returnOutput'],此处会直接抛出KeyError异常终止流程,所以不会打印后续的rep变量,是看起来卡住的最直接原因。
  • 解码编码不匹配:decode()默认用UTF-8编码,但你提供的输出是法语区Windows cmd的返回结果,默认编码为CP850,字节中的\x82、\xff都是该编码下的合法字符,编码不匹配可能触发隐性异常。
  • WebSocket变量名错误:回调函数的参数是wsapp,但你最后发送数据用的是ws.send(),如果全局没有定义ws变量,也会触发未定义异常终止流程。
  • subprocess调用不完善:subprocess.check_output默认只捕获标准输出,如果命令执行产生错误输出,会直接抛出异常中断运行。

修复代码

import subprocess
import json

def on_message(wsapp, msg):
    print(msg)
    req = json.loads(msg)
    print(1)
    try:
        # 合并stderr到stdout,避免命令报错直接中断
        res = subprocess.check_output(
            req["command"], 
            shell=True,
            stderr=subprocess.STDOUT
        )
        print(res)
        # 显式指定CP850编码适配法语区Windows cmd输出,不确定编码可以换成latin-1兼容所有单字节
        decRes = res.decode('cp850', errors='ignore')
        # 修正键名,用get方法避免键不存在报错
        rep = {"command": req["command"], 'answer': decRes, "sendOutput": req.get('sendOutput', True)}
        print(rep)
        # 修正变量名,用回调参数里的wsapp发送
        wsapp.send(json.dumps(rep))
    except Exception as e:
        # 捕获所有异常,返回错误信息避免程序无响应
        err_rep = {
            "command": req["command"], 
            'answer': f"执行失败:{str(e)}", 
            "sendOutput": req.get('sendOutput', True)
        }
        wsapp.send(json.dumps(err_rep))

内容的提问来源于stack exchange,提问作者OwOchlé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:09:02