在 python 中解析管道命令流时出现问题,需要帮助

在 python 中解析管道命令流时出现问题,需要帮助

想将我的 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。在我的首个项目中(仍在进行中),我不得不使用一系列xrandrwmctrl命令。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

很高兴回答任何问题:)

相关内容