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

