Я пытаюсь запустить команду терминала (Linux) и использовать вывод.
list = subprocess.Popen(
'bgpq3 -j -A AS-FACEBOOK -m 24 -l Facebook',
shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = list_prefixes.communicate()
print(stdout)
вывод:
{ "Facebook": [
{ "prefix": "5.45.32.0/22", "exact": true },
{ "prefix": "185.160.58.0/23", "exact": false, "greater-equal": 24, "less-equal": 24 },
{ "prefix": "5.57.248.0/21", "exact": true },
{ "prefix": "5.206.208.0/20", "exact": true },
{ "prefix": "185.54.94.0/23", "exact": false, "greater-equal": 24, "less-equal": 24 },
{ "prefix": "31.193.104.0/21", "exact": true },
{ "prefix": "213.233.192.0/18", "exact": true },
{ "prefix": "217.26.96.0/20", "exact": true }
] }
затем я пытаюсь напечатать каждую строку, используя этот код:
for item in stdout['Facebook']:
if item['exact'] == 'true':
print ("{}, {}".format(item['prefix'].split('/')[0], item['exact']))
else:
print ("{}, {}".format(item['prefix'].split('/')[0], item['greater-equal']))
Но я получаю эту ошибку:
TypeError: string indices must be integers
Проблема заключается в типе класса stdout. когда я использую тип (stdout), результат:
<class 'str'>
Есть ли способ исправить это?






Используйте модуль json для преобразования строки в объект dict.
Бывший:
import json
stdout = """{ "Facebook": [
{ "prefix": "5.45.32.0/22", "exact": true },
{ "prefix": "185.160.58.0/23", "exact": false, "greater-equal": 24, "less-equal": 24 },
{ "prefix": "5.57.248.0/21", "exact": true },
{ "prefix": "5.206.208.0/20", "exact": true },
{ "prefix": "185.54.94.0/23", "exact": false, "greater-equal": 24, "less-equal": 24 },
{ "prefix": "31.193.104.0/21", "exact": true },
{ "prefix": "213.233.192.0/18", "exact": true },
{ "prefix": "217.26.96.0/20", "exact": true }
] }"""
stdout = json.loads(stdout)
for item in stdout['Facebook']:
if item['exact'] == 'true':
print ("{}, {}".format(item['prefix'].split('/')[0], item['exact']))
else:
print ("{}, {}".format(item['prefix'].split('/')[0], item.get('greater-equal')))
Выход:
5.45.32.0/22, None
185.160.58.0/23, 24
5.57.248.0/21, None
5.206.208.0/20, None
185.54.94.0/23, 24
31.193.104.0/21, None
213.233.192.0/18, None
217.26.96.0/20, None
Примечание: У некоторых элементов нет ключа 'greater-equal', поэтому используйте item.get('greater-equal')