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é
相关产品推荐
相关产品推荐

