2015-04-23 3 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() 

Это небольшой скрипт для мониторинга температуры в Python с использованием smartmontools и lm-датчиков. Но когда я пытаюсь запустить его, у меня есть ошибка.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 ВС 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 для получения дополнительной информации.)

Пример:

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' не имеет атрибута 'group' –

+0

Интересно, что вы получаете разные возвращаемые значения. Независимо от того, ваша ошибка «NoneType» почти наверняка связана с получением возвращаемого значения «None» из вашего вызова 're.search()', который больше не может быть в рамках этого вопроса. – BlackVegetable

+0

См. Https://docs.python.org/3.4/library/re.html#re.search – BlackVegetable

1

код возврата 2 из smartctl означает, что он не смог открыть устройство. Убедитесь, что пользователь, который запускает код 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' для меня вообще не имеет никаких' '' 'и никаких парнеров. –

Смежные вопросы