如何直接将subprocess命令输出转为有效JSON字典而非读取文件?
解决方法
你的问题核心是搞反了JSON的序列化和反序列化操作:
- 你现在通过subprocess捕获到的内容是命令输出的原始JSON字符串,直接调用
json.dumps()是把这个字符串再转成JSON格式的字符串,自然会出现大量转义字符(因为要把字符串里的引号、换行符等转义)。 - 正确的做法和读取文件时一致,用
json.loads()把这个JSON字符串反序列化成字典。
正确代码示例
用subprocess.check_output的写法
import subprocess import json # 捕获命令输出并解码为字符串 output_str = subprocess.check_output(["cmd", "-J"]).decode("utf-8") # 把JSON字符串转成字典 data = json.loads(output_str)
用subprocess.run的更推荐写法(Python3.7+)
import subprocess import json # text=True 直接返回字符串,无需手动decode result = subprocess.run(["cmd", "-J"], capture_output=True, text=True) # 从标准输出中解析JSON为字典 data = json.loads(result.stdout)
额外注意事项
- 如果命令输出的编码不是UTF-8,需要调整
decode()的参数(比如decode("gbk")),或者在subprocess.run里用encoding="gbk"替代text=True。 - 确保命令
cmd -J确实输出了合法的JSON格式内容,没有额外的冗余输出(比如日志、错误信息混在标准输出里),否则json.loads会报错,这时可以检查result.stderr查看错误信息。
内容的提问来源于stack exchange,提问作者Oliver Henriot
相关产品推荐
相关产品推荐

