Попробуйте Python JSON, за исключением того, что блок не работает

После нескольких попыток этот код все еще не работает. То, что я пытаюсь сделать, это отправить «статистику процессора» в формате JSON на сервер. Дело в том, что cpustats сам по себе в порядке - есть только 1 namedtuple с разными cpupercentages - user, idle и т. д. Но 'percpu' возвращает список namedtuple каждого процессора (пользователя, простоя и т. д.). Поэтому я не могу преобразовать список в словарь. Я пытаюсь просмотреть список, а затем отправить каждый из namedtuple на сервер. (Для справки - я использую 2.7.5). Скрипт работал нормально без попыток зациклиться и попробовать/исключить - он вернул "200 OK". Но теперь, когда я запускаю его, он даже не возвращает ошибку, какое-либо ответное сообщение/статус. Как будто скрипт просто обходит весь блок try/except. Просто строка «print cpuStats» в конце работает как надо. (Отступ в этом вопросе немного смещен, но в сценарии все в порядке)

    import psutil 
    import socket
    import time
    import sample
    import json
    import httplib
    import urllib

    serverHost = sample.host
    port = sample.port

    thisClient = socket.gethostname()
    currentTime = int(time.time())
    s = socket.socket()
    s.connect((serverHost,port))

    cpuStats = psutil.cpu_times_percent(percpu=True)
    print cpuStats
    def loop_thru_cpus():

       for i in cpuStats:

         cpuStats = cpuStats[i]
         cpuStats = json.dumps(cpuStats._asdict())

         try:

             command = 'put cpu.usr ' + str(currentTime) + " " + str(cpuStats[0]) + "host ="+  thisClient+ "/n"
             s.sendall(command)
             command = 'put cpu.nice ' + str(currentTime) + " " + str(cpuStats[1]) + "host ="+ thisClient+ "/n"
             s.sendall(command)
             command = 'put cpu.sys ' + str(currentTime) + " " + str(cpuStats[2]) + "host ="+ thisClient+ "/n"
             s.sendall(command)
             command = 'put cpu.idle ' + str(currentTime) + " " + str(cpuStats[3]) + "host ="+ thisClient+ "/n"
             s.sendall(command)

             params = urllib.urlencode({'cpuStats': cpuStats, 'thisClient': 1234})
             headers = httplib.HTTPConnection(serverHost, port)
             conn.request("POST", "", params, headers)
             response = conn.response()
         print response.status, response.reason

    except IndexError:
            break

        i = i+1

    s.close()

person askance    schedule 10.09.2013    source источник
comment
1. за исключением того, что блок не соответствует отступу блока try, 2. loop_thru_cpus никогда не вызывается 3. Вы вызываете метод запроса для некоторого объекта conn, но, насколько я могу судить, он не определен. 4. Удалите конечные пробелы.   -  person zero323    schedule 11.09.2013
comment
Большое спасибо :) Я добавил текущий ответ на его запуск в комментарии к ответу unutbu.   -  person askance    schedule 11.09.2013


Ответы (1)


Вместо:

def loop_thru_cpus():
   for i in cpuStats:
     cpuStats = cpuStats[i]
     cpuStats = json.dumps(cpuStats._asdict())   
     ...  
     i = i+1

Пытаться:

def loop_thru_cpus():
   for stat in cpuStats:
       stat = json.dumps(stat._asdict())     

Когда ты сказал

for i in cpuStats:

i принимает значения из cpuStats. i в данном случае не является целым числом. Так что i = i+1 не имеет смысла.


cpuStats = cpuStats[i]

Вероятно, это вызвало ошибку IndexError (поскольку i не является целым числом), но по какой-то причине вы не видите возникшее исключение.

Также обратите внимание, что вы переопределяете cpuStats здесь, что, вероятно, не то, что вы хотите делать.


Вероятно, в вашем коде есть ошибки с отступами. Запуск кода, который вы разместили через cat -A, показывает вкладки (обозначенные ниже ^I):

             try:$
^I        $
                 command = 'put cpu.usr ' + str(currentTime) + " " + str(cpuStats[0]) + "host ="+  thisClient+ "/n"$
...
                 params = urllib.urlencode({'cpuStats': cpuStats, 'thisClient': 1234})$
...
^I         print response.status, response.reason$
$
^I    except IndexError:$
                break$

Вы не можете смешивать вкладки и пробелы в отступе в коде Python. Либо используй то, либо другое. Руководство по стилю PEP8 (и большая часть кода, который вы видите в сети) использует 4 пробела. Смешивание табуляции и пробела обычно приводит к IndentationError, но иногда вы получаете не ошибку, а просто код, который ведет себя неожиданным образом. Поэтому (при использовании соглашения о 4-х пробелах) будьте осторожны, чтобы использовать редактор, который добавляет 4 пробела при нажатии клавиши табуляции.

Поскольку вы не видите IndexError, возможно, вы не видите и IndentationError, которая должна была произойти. Как именно вы решаете проблему?

person unutbu    schedule 10.09.2013
comment
Большое спасибо! Вы, ребята, потрясающие! Отступ здесь был неформатирован, и предложения, сделанные вами и zero323, сработали (насколько я могу судить) — основной проблемой была индексация. Запустив его сейчас, я получаю «200 OK» для всех 4 процессоров на моей машине. Но 1 вопрос - есть ли способ проверить с помощью Bash, размещены ли данные на сервере? - person askance; 11.09.2013
comment
Я не знаю лучшей альтернативы, чем загрузка данных. - person unutbu; 11.09.2013
comment
Это нормально. В любом случае, я скоро узнаю от архитектора проекта. - person askance; 11.09.2013