想将我的 bash 脚本转换为 python。脚本
sensors | grep "Core"
返回一个易于解析的漂亮输出,CPU 的每个核心一行,如果读入数组,则使用
IFS=' ' read -r -a array <<< "$line"
T="${array[2]}"
U="${T:1:-2}"
所需温度是数组中的第二个元素,并且可以很容易地(有点)删除“+”和尾随的摄氏度符号,如上面的代码所示。
尝试使用以下代码在 Python 中执行此操作
all_temps = check_output(["sensors"])
exe = Popen(['grep', 'Core'],stdout=PIPE, stdin=PIPE);
cpu_temps = exe.communicate(input=all_temps)[0];
对我来说,困难在于 cpu_temps 中的数据是一堆 ASCII 字节,包括特殊代码。我认为我可以轻松地使用换行符作为分隔符来拆分数据,为每个 CPU 获取一行,然后使用空格拆分以获取当前温度值。这应该有效,而且基本上就是我的 bash 脚本的工作方式。我也以同样的方式处理了“nvidia-smi”,也以同样的方式从传感器中提取了 ATI 温度。只是不知道如何在 python 中做到这一点。问题:
print(cpu_temps.split()) ---
b'Core'
b'0:'
b'+42.0\xc2\xb0C'
b'(high'
b'='
b'+84.0\xc2\xb0C,'
b'crit'
b'='
b'+100.0\xc2\xb0C)'
b'Core'
我不确定上面我看的是什么,甚至不知道如何提取每个核心编号和相应的值。可能我完全搞错了,或者应该坚持使用我的 bash 脚本。当我尝试拆分时,我开始收到错误,提示 str 是预期的,但我有字节。
答案1
我也和你一样,从 Bash Basin 航行到 Python Peninsula。在我的首个项目中(仍在进行中),我不得不使用一系列xrandr
和wmctrl
命令。grep
叹)您的解决方案是:
$ sensors | grep Core
Core 0: +47.0°C (high = +100.0°C, crit = +100.0°C)
Core 1: +49.0°C (high = +100.0°C, crit = +100.0°C)
Core 2: +45.0°C (high = +100.0°C, crit = +100.0°C)
Core 3: +47.0°C (high = +100.0°C, crit = +100.0°C)
$ sensors.py
49
51
47
48
这是你的脚本:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
list_cores = os.popen("sensors | grep Core").read().splitlines()
for l in list_cores:
# Core 0: +47.0°C (high = +100.0°C, crit = +100.0°C) <---- sample
# ^ ^
# | |
# | +---- 2md split on decimal take [0] element (b list)
# +------- 1st aplit on plus sign take [1] element (a list)
a = l.split("+")
b = a[1].split(".")
c = b[0]
print (c)
运行前标记为可执行:chmod a+x sensors.py
很高兴回答任何问题:)