Python subprocess.CalledProcessError:返回非零退出状态2
这是一个使用smartmontools和lm传感器在Python中监视温度的小脚本。但是当我尝试运行它时,我有一个错误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
#!/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