2015-04-23 106 views
4
#!/usr/bin/env python 
# encoding: utf-8 

import re 
import subprocess 
import time 
import json 


def get_temperatures(disks): 
    sensors = subprocess.check_output(["sensors"]) 
    temperatures = {match[0]: float(match[1]) for match in re.findall("^(.*?)\:\s+\+?(.*?)°C", 
              sensors, re.MULTILINE)} 
    for disk in disks: 
     output = subprocess.check_output(["smartctl", "-A", disk]) 
     temperatures[disk] = int(re.search("Temperature.*\s(\d+)\s*(?:\([\d\s]*\)|)$", 
              output, re.MULTILINE).group(1)) 
    return temperatures 


def main(): 
    while True: 
     print json.dumps(get_temperatures(("/dev/sda2", "/dev/sdb1"))) 
     time.sleep(20) 


if __name__ == '__main__': 
    main() 

這是一個使用smartmontools和lm-sensors監視Python溫度的小腳本。但是當我嘗試運行它時,我有一個錯誤Python subprocess.CalledProcessError:返回非零退出狀態2

subprocess.CalledProcessError: Command '['smartctl', '-A', '/dev/sda2']' returned non-zero exit status 2 

但是,當我在終端中手動嘗試此命令他們工作很好。

一些信息:

uname -a 

的Linux LME 4.0.0-040000泛型#201504121935 SMP太陽4月12日23時36分33秒UTC 2015年x86_64的x86_64的x86_64的GNU/Linux的

+1

你是什麼意思「他們工作很好?」退貨時他們的退出代碼是什麼? –

+0

如果我在終端輸入smartctl -A/dev/sda,這個工作完美 –

+0

如果你之後運行'echo $?',它是否打印'0'? –

回答

3

一個CalledProcessError會如果任何非零退出代碼由您的被調用進程返回,則會引發。在命令行上,你應該echo $?得到最後的返回代碼,看它是否真的返回2.我懷疑它會。

如果在你的python代碼中沒問題,你可以除了CalledProcessError並從其屬性中獲得任何信息,特別是output屬性。 (查找在python docs此錯誤的詳細信息。)

實施例:2從smartctl意味着它未能打開所述裝置

import subprocess 
output = None 
try: 
    output = subprocess.check_output(["smartctl", "-A", "/dev/sda2"]) 
except subprocess.CalledProcessError as e: 
    output = e.output 
+0

➜〜echo $? 我改變你的代碼,現在我有 AttributeError:'NoneType'對象沒有屬性'組' –

+0

有趣的是,你得到不同的返回值。無論如何,你的'NoneType'錯誤幾乎肯定是從你的're.search()'調用中返回'None'的值,這可能不在這個問題的範圍之內。 – BlackVegetable

+0

請參閱:https://docs.python.org/3.4/library/re.html#re.search – BlackVegetable

1

返回代碼。確保運行Python代碼的用戶有權打開您希望檢查的所有磁盤。

從返回值smartctl讀取的手冊頁的部分:

Bit 1: Device open failed, or device did not return an IDENTIFY DEVICE structure

所以我懷疑這是一個真正的權限問題。我在我的系統上驗證了這一點。如果我運行subprocess.check_output([ 'smartctl', '-A', '/dev/sda2' ]),我得到的錯誤返回2,但如果我運行subprocess.check_output([ 'sudo', 'smartctl', '-A', '/dev/sda2' ])它的作品,我看到命令的輸出。

+0

現在運行AttributeError後:'NoneType'對象沒有屬性'group' –

+0

這表明你現在正在輸出,但你的正則表達式不匹配任何東西。 –

+0

我注意到了一些關於正則表達式的東西,你可能想看看。溫度過後。*你只要尋找'\ s',但你可能想要尋找'\ s +'。在那之後,你必須和你自己的輸出進行比較,因爲我沒有任何只有數字和空格的行,並且在行尾有''''和'|'關鍵字,事實上, 'smartctl -A'對我來說根本沒有任何'|',也沒有任何parens。 –

相關問題