2013-09-10 96 views
1

多次尝试后,此代码仍然失败。我想要做的是将“cpu stats”作为JSON发送到服务器。事情是,单独的cpustats很好 - 只有一个名称不同的cpupercentages - 用户,空闲等。但'percpu'返回每个cpu的名称(用户,空闲等)的列表。所以我无法将列表转换为字典。我试图遍历列表,然后将每个namedtuple发送到服务器。 (对于参考 - 我使用2.7.5)。该脚本工作正常,没有尝试循环和尝试/除了 - 它返回了'200 OK'。但是现在,当我运行它时,它甚至不会返回错误,任何响应消息/状态。就好像脚本只是绕过整个try/except块。只需在最后的“印刷cpuStats”产品线就可以实现。 (在这个问题上的压痕是有点过,但它在脚本的罚款)Python JSON尝试除了块不工作

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() 
+1

1.除了块不匹配try块的缩进,2.从未调用loop_thru_cpus 3.您对某个conn对象调用request方法,但据我所知它没有定义。 4.删除尾随空格。 – zero323

+0

Thx这么多:)我已经添加了当前的响应运行它评论unutbu的答案。 – user2480526

回答

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-spaces约定)要小心使用一个编辑器,当按Tab键时,它会增加4个空格。

由于您没有看到IndexError,因此您可能没有看到应该发生的IndentationError。你究竟如何处理这个问题?

+0

Thx太多了!你们真棒!这里的缩进是无格式的,你和zero323的建议都起作用了(据我所知) - 索引是主要问题。现在运行它 - 我的机器中的所有4个cpus都是'200 OK'。1问题虽然 - 有没有办法检查Bash是否发布在服务器上的数据? – user2480526

+0

我不知道比下载数据更好的选择。 – unutbu

+0

没关系。无论如何,我很快会从项目设计师那里了解到。 – user2480526