Хранение напечатанных данных в переменных

У меня есть этот код ниже, который распечатывает качество соединения и уровень сигнала соединения WiFi. Я пытаюсь сохранить данные, полученные в переменные, чтобы я мог обрабатывать дальше, но я застрял, не зная, как это сделать.

while True:
cmd = subprocess.Popen('iwconfig %s' % args.interface, shell=True,
                       stdout=subprocess.PIPE)
for line in cmd.stdout:
    if 'Link Quality' in line:
        print line.lstrip(' '),
    elif 'Not-Associated' in line:
        print 'No signal'
time.sleep(1)

Пример вывода

Link Quality=63/70  Signal level=-47 dBm

3 ответа

У вас есть два варианта,

  1. Изменить существующую кодовую базу
  2. Написать обертку над текущим исполняемым кодом

Если вы выберете вариант 1, я думаю, это простой и понятный код Python.

Если вы выберете вариант 2, вы захотите разобрать standard output stream существующего исполняемого кода. Примерно так будет работать:

from subprocess import getstatusoutput as gso

# gso('any shell command')
statusCode, stdOutStream = gso('python /path/to/mymodule.py')
if statusCode == 0:
    # parse stdOutStream here
else:
    # do error handling here

Теперь вы можете разобрать stdOutStream использование нескольких строковых операций, которые не должны быть сложными, если ваши выходные данные имеют предсказуемую структуру.

Вместо печати сохраните результат в структуре данных, например, в виде списка:

while True:
    result = []
    cmd = subprocess.Popen('iwconfig %s' % args.interface, shell=True,
                           stdout=subprocess.PIPE)
    for line in cmd.stdout:
        if 'Link Quality' in line:
            result.append(line.lstrip())
        elif 'Not-Associated' in line:
            result.append('No signal')

    # do soemthing with `result`
    #for line in result:
    #    line ...... 

    time.sleep(1)

Вы можете проанализировать вывод в более удобную структуру данных:

import re
results = []
while True:
    cmd = subprocess.Popen('iwconfig %s' % args.interface, shell=True,
                       stdout=subprocess.PIPE)
    for line in cmd.stdout:
       results.append(dict(re.findall(r'(.*?)=(.*?)\s+', line))
    time.sleep(1)

for count,data in enumerate(results):
    print('Run number: {}'.format(count+1))
    for key,value in data.iteritems():
        print('\t{} = {}'.format(key, value))
Другие вопросы по тегам