如何直接获取 subprocess.check_output 的输出作为有效的 json,而不是读取存储在文件中的结果?

问题描述 投票:0回答:1

我有一个系统命令,可以生成 json 输出:(

$ cmd -J > file
)。 我可以使用以下方法将这些数据完美地读取到字典中:

with open("file", "r") as i:
    data=json.loads(i)

我想在没有中间文件的情况下做同样的事情,通过子进程调用直接生成数据:

data=subprocess.check_output(["cmd", "-J"]).decode("utf-8")

或:

call=subprocess.call(["cmd", "-J"], capture_output=True)
data=call.output.decode("utf-8")

但是

json.dumps(data)
不会生成字典,到处都有
\\"
\\n
字符。调用替换来删除它们并不能改善情况。

如何获得与仅读取作为磁盘文件存储的命令输出的字典相同的字典?

python json python-3.x subprocess
1个回答
0
投票

以下是您所追求的吗?

cat ~/tmp/test.py
import subprocess
import json

#sample json data
command = ['curl', '-s',  'https://microsoftedge.github.io/Demos/json-dummy-data/64KB.json']
res = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

if res.returncode == 0:
    try:
        jsonOut = json.loads(res.stdout)
        for item in range(5):
            print(jsonOut[item],'\n')
    except json.JSONDecodeError as e:
        print("Failed to parse:", e)
else:
    print("Error:", res.stderr)

#run it
python /tmp/test.py

#produces...
{'name': 'Adeel Solangi', 'language': 'Sindhi', 'id': 'V59OF92YF627HFY0', 'bio': 'Donec lobortis eleifend condimentum. Cras dictum dolor lacinia lectus vehicula rutrum. Maecenas quis nisi nunc. Nam tristique feugiat est vitae mollis. Maecenas quis nisi nunc.', 'version': 6.1} 

{'name': 'Afzal Ghaffar', 'language': 'Sindhi', 'id': 'ENTOCR13RSCLZ6KU', 'bio': 'Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Etiam congue dignissim volutpat. Vestibulum pharetra libero et velit gravida euismod.', 'version': 1.88} 

{'name': 'Aamir Solangi', 'language': 'Sindhi', 'id': 'IAKPO3R4761JDRVG', 'bio': 'Vestibulum pharetra libero et velit gravida euismod. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Fusce eu ultrices elit, vel posuere neque.', 'version': 7.27} 

{'name': 'Abla Dilmurat', 'language': 'Uyghur', 'id': '5ZVOEPMJUI4MB4EN', 'bio': 'Donec lobortis eleifend condimentum. Morbi ac tellus erat.', 'version': 2.53} 

{'name': 'Adil Eli', 'language': 'Uyghur', 'id': '6VTI8X6LL0MMPJCC', 'bio': 'Vivamus id faucibus velit, id posuere leo. Morbi vitae nisi lacinia, laoreet lorem nec, egestas orci. Suspendisse potenti.', 'version': 6.49} 

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.