Python subprocess.CalledProcessError:返回非零退出状态2

时间:2015-04-23 13:10:09

标签: python linux

#!/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温度的小脚本。但是,当我尝试运行它时,我有一个错误

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

但是当我在终端中手动尝试此命令时,它们运行良好。

一些信息:

uname -a 

Linux LME 4.0.0-040000-generic#201504121935 SMP Sun Apr 12 12:36:33 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux

2 个答案:

答案 0 :(得分:5)

如果被调用进程返回任何非零退出代码,则会引发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

答案 1 :(得分:1)

smartctl返回2代码表示无法打开设备。确保运行Python代码的用户有权打开您要检查的所有磁盘。

来自smartctl手册页的RETURN VALUES部分:

  

位1:设备打开失败,或设备未返回IDENTIFY DEVICE结构

所以我怀疑这确实是一个权限问题。我在我的系统上验证了这一点。如果我运行subprocess.check_output( [ 'smartctl', '-A', '/dev/sda2' ] )我得到错误,它返回2,但是如果我运行subprocess.check_output( [ 'sudo', 'smartctl', '-A', '/dev/sda2' ] )它可以工作,我看到命令的输出。