Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.CalledProcessError:返回非零退出状态2_Python_Linux - Fatal编程技术网

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

Python subprocess.CalledProcessError:返回非零退出状态2,python,linux,Python,Linux,这是一个使用smartmontools和lm传感器在Python中监视温度的小脚本。但是当我尝试运行它时,我有一个错误 #!/usr/bin/env python # encoding: utf-8 import re import subprocess import time import json def get_temperatures(disks): sensors = subprocess.check_output(["sensors"]) t

这是一个使用smartmontools和lm传感器在Python中监视温度的小脚本。但是当我尝试运行它时,我有一个错误

#!/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()
但当我在终端中手动尝试这个命令时,它们工作得非常好

一些信息:

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

如果被调用的进程返回任何非零的退出代码,则将引发被调用的进程错误。在命令行上,您应该
echo$?
获取最后一个返回代码,并查看它是否真的返回2。我想会的

如果您的python代码中没有问题,那么您可以删除
调用的进程错误
,并从其属性中获取任何信息,尤其是
输出
属性。(有关详细信息,请在中查找此错误。)

例如:

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

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

从smartctl手册页的返回值部分:

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


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

你说“它们工作得很好”是什么意思当他们返回时,他们的退出代码是什么?如果我在终端中键入smartctl-A/dev/sda,这项工作会很好。如果您立即运行
echo$?
,它是否打印
0
?是的,只有0,您知道吗?您是否以同一用户的身份运行这两个?也许运行Python的用户没有打开/dev/sda2的权限?➜ ~ 回声$?1我像你说的那样更改代码,现在我有了AttributeError:'NoneType'对象没有属性'group',有趣的是你得到了不同的返回值。无论如何,您的
NoneType
错误几乎肯定是由于从您的
re.search()
调用中获得了
None
返回值,这可能不再属于此问题的范围。@davidernburg Nice catch。修复。现在在运行AttributeError后:“NoneType”对象没有表示您现在正在获取输出的属性“group”,但您的正则表达式与任何内容都不匹配。我注意到关于正则表达式的一些内容,您可能需要查看。温度之后。*您只需查找
\s
,但可能需要查找
\s+
。在这之后,您必须与您自己的输出进行比较,因为我没有任何行只有数字和空格,后面紧跟着一个关闭的
和一个
|
,事实上,
smartctl-a
对于我来说根本没有任何
|
,也没有任何parens。首先,你必须在这个python脚本上使用sudo,对吗?(很好的回答,顺便说一下+1)您可以在脚本中使用sudo,但如果是这样,您可能希望设置它,以便运行它的用户不需要密码来执行smartctl命令。
Linux LME 4.0.0-040000-generic #201504121935 SMP Sun Apr 12 23:36:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
import subprocess
output = None
try:
    output = subprocess.check_output(["smartctl", "-A", "/dev/sda2"])
except subprocess.CalledProcessError as e:
    output = e.output