簡體   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