繁体   English   中英

Python JSON尝试除外块不起作用

[英]Python JSON try except block not working

多次尝试后,此代码仍然失败。 我想做的是将“ cpu stats”作为JSON发送到服务器。 事实是,单独使用cpustats就可以了-只有一个具有不同cpupercentages的namedtuple-用户,闲置等。但是'percpu'返回每个cpu的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()

代替:

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个空格的约定)请小心使用在按下Tab键时添加4个空格的编辑器。

由于您没有看到IndexError,因此也可能没有看到应该已经发生的IndentationError。 您究竟如何解决问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM