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

Python run_prog函数偶发json.decoder.JSONDecodeError错误原因咨询

问题诱因分析
  • stdout与stderr输出顺序不稳定
    你代码中./a.out的运行结果输出到标准输出流(stdout),而/usr/bin/time的统计结果默认输出到标准错误流(stderr)。Docker SDK的exec_run方法默认会合并两个流的输出,而stdout默认有缓冲区、stderr默认无缓冲区,两者输出顺序没有固定保证,偶发会出现time的统计结果跑到程序输出前面的情况,直接打乱你手动拼接的JSON结构,这是偶发报错的核心诱因。
  • 手动拼接JSON的方式存在固有缺陷
    你直接通过字符串拼接构造JSON格式,没有对特殊字符做转义处理。哪怕输出顺序正常,只要./a.out的输出中包含双引号、换行符、反斜杠等JSON特殊字符,就会直接破坏JSON的语法结构,触发解析错误。
  • JSON尾部多余逗号的兼容性问题
    你拼接的JSON结尾处额外加了一个逗号:result = '{"result":"' + result + ',}',标准JSON规范不允许尾部逗号写法,也存在概率触发解析错误。
修复建议
  • 调用exec_run时添加参数stdout=True, stderr=True, demux=True,分开获取stdout(程序输出)和stderr(time统计结果),从根源避免流顺序混乱。
  • 不要手动拼接JSON,而是先把结果存到Python字典里,再用json.dumps()序列化,自动处理转义,避免语法错误。
  • 参考修复代码:
def run_prog(compile_container, user_input, container_file_path):
    time_check_command = '/usr/bin/time -f "\"memory\":\"%M\",\"time\":\"%e\""'
    # 分开捕获stdout和stderr
    exit_code, (stdout, stderr) = compile_container.exec_run(
        f"/bin/bash -c 'echo {user_input} | {time_check_command} ./a.out'",
        workdir=container_file_path,
        stdout=True,
        stderr=True,
        demux=True
    )
    # 分别处理输出
    prog_output = stdout.decode('utf-8').strip()
    time_stats = stderr.decode('utf-8').strip()
    # 用字典构造结果,避免手动拼接JSON
    result_dict = {
        "result": prog_output
    }
    # 解析time的统计结果
    import json
    time_dict = json.loads(f"{{{time_stats}}}")
    result_dict.update(time_dict)
    if result_dict['time'] == '0.00':
        result_dict['time'] = '<0.01'
    return result_dict

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:21:03