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

Chrome原生消息传递返回Base64字符串时抛出错误原因排查

我来帮你排查这个问题——你踩了Python里os.system()的一个常见坑!

问题根源:os.system()返回的不是命令输出

你以为os.system("<返回Base64的bash命令>")会把命令的输出赋值给dataurl,但实际上**os.system()返回的是命令的退出状态码**(0表示执行成功,非0值表示执行失败),而不是命令打印到终端的内容。

举个例子:如果你的bash命令执行成功,dataurl会是0,这时候你拼接出来的JSON会是{"text": "0"},完全不是你要的Base64字符串;如果命令执行有问题,dataurl会是一个非0数字,同样不符合Native Messaging要求的JSON格式。Chrome的Native Messaging宿主收到格式错误的消息,直接就断开连接了,这就是你看到报错的原因。

正确的解决方法:用subprocess模块捕获命令输出

要获取bash命令的实际输出,你需要用Python的subprocess模块,它专门用于处理子进程的输入/输出。这里推荐用subprocess.check_output()或者subprocess.run(),前者适合直接捕获成功执行的输出,后者更灵活。

修改你的代码如下:

import subprocess
import json  # 推荐用json模块生成合法的JSON,避免手动拼接出错

# 替换成你的bash命令
bash_command = "<返回Base64的bash命令>"

try:
    # 执行命令,捕获标准输出,text=True直接返回字符串(不用手动转码)
    # shell=True允许执行bash命令(如果命令是复杂的管道/脚本,需要这个参数)
    base64_output = subprocess.check_output(bash_command, shell=True, text=True).strip()
    
    # 用json.dumps生成合法的JSON,自动处理特殊字符(虽然Base64不会有,但更稳妥)
    payload = json.dumps({"text": base64_output})
except subprocess.CalledProcessError as e:
    # 处理命令执行失败的情况,比如返回错误信息
    payload = json.dumps({"text": f"Command failed: {str(e)}"})

# 接下来把payload发送给Chrome(和原代码的发送逻辑一致)

额外注意事项

  1. 清理输出内容:用.strip()去掉输出前后的换行符/空格,避免JSON里出现多余的转义字符。
  2. 安全问题:如果bash_command包含用户输入,shell=True会有注入风险,这种情况下建议拆分命令为列表形式(比如["echo", "hello"]),不要用shell=True。
  3. 错误处理:check_output()会在命令执行失败(退出状态非0)时抛出CalledProcessError,所以加上try-except可以避免脚本崩溃,同时给Chrome返回错误信息。

这样修改后,你就能正确获取到Base64字符串,并生成符合要求的JSON消息发送给Chrome了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:45:54