перенаправление вывода команды в переменную в python

Рейтинг: 0Ответов: 1Опубликовано: 26.05.2023

подскажите пожалуйста, есть команда:

nova —os-project-name test1 —insecure quota-show —detail

она для просмотра квот openstack, имеет вывод в следующем виде:

+----------------------+----------------------------------------------+
| Quota | Limit |
+----------------------+----------------------------------------------+
| instances | {'reserved': 0, 'limit': 10, 'in_use': 0} |
| cores | {'reserved': 0, 'limit': 20, 'in_use': 0} |
| ram | {'reserved': 0, 'limit': 51200, 'in_use': 0} |
| metadata_items | {'reserved': 0, 'limit': 128, 'in_use': 0} |
| key_pairs | {'reserved': 0, 'limit': 100, 'in_use': 0} |
| server_groups | {'reserved': 0, 'limit': 10, 'in_use': 0} |
| server_group_members | {'reserved': 0, 'limit': 10, 'in_use': 0} |
+----------------------+----------------------------------------------+

хочу парсить вывод в формат json следующим образом:

def parse(output):
    result = {}
    lines = [l for l in output.split("\n") if l.startswith("|")][1: ]
    for line in lines:
        name = line.split("|")[1].strip()
        value = eval(line.split("|")[2].strip())
        result[name] = value
    return result

как это сделать?

Ответы

▲ 1

Чтобы получить выход команды с помощью subprocess:

import json
import subprocess


def parse(output):
    result = {}
    lines = [l for l in output.split("\n") if l.startswith("|")][1:]
    for line in lines:
        name = line.split("|")[1].strip()
        value = eval(line.split("|")[2].strip())
        result[name] = value
    return result


result = subprocess.check_output(['nova', '—os-project-name',
                                  'test1', '—insecure quota-show', '—detail']).decode('cp866')

with open('result.json', 'w') as f:
    json.dump(parse(result), f)