我愿意确定一堆Linux计算机的当前CPU使用率,所有这些都可通过SSH连接获得。至于现在我已经通过psutil和子进程模块管理了一些东西,但如果我能从subprocess.check_output中获取一个列表,它可能会更直接。
所以我定义了一个cpu_script.py:
import psutil
print(psutil.cpu_percent(interval=1,percpu=True))
在我的主脚本中调用,该脚本位于同一文件夹中,其中包含:
import subprocess
import os
import numpy as np
import psutil
usr = "AA"
computer = "BB"
cpu_script = os.path.join(os.getcwd(),"cpu_script.py")
test = subprocess.check_output("ssh -X " + usr + "@" + computer +
"python3 -u - < " + cpu_script,shell=True).strip()
由于cpu_percent的输出通常在列表中,我希望我的“test”变量是一个列表,但我真正得到的是一个字节:
input(test)
>> b'[4.0, 5.0, 7.0, 10.9, 18.4, 1.0, 4.0, 3.0]'
input(type(test))
>> <class 'bytes'>
在这里,我设法弯曲一切以最终获得一个数组(使用decode + replace + np.fromstring),但它远远不能令人满意:
tmp = test.decode("utf-8")
input(tmp)
>> [4.0, 5.0, 7.0, 10.9, 18.4, 1.0, 4.0, 3.0]
input(type(tmp))
>> <class 'str'>
tmp = (tmp.replace('[','')).replace(']','')
result = np.fromstring(tmp, sep=',')
input(result)
>> [ 4. 5. 7. 10.9 18.4 1. 4. 3. ]
input(type(result))
>> <class 'numpy.ndarray'>
难道我不能直接得到一个列表或数组的subprocess.check_output变量吗?我错过了什么?
另外如果有办法避免定义cpu_script,因此直接传递子进程中的python命令,我会感兴趣!我现在所有尝试都失败了,这里很棘手的部分是有一个ssh连接和一个python3控制台命令,后跟python命令。
感谢您的帮助!
答案 0 :(得分:1)
基础python程序&#34;序列化&#34;输出为文本。
check_output
返回您需要解码的bytes
对象,然后&#34;反序列化&#34;。
我建议:
import ast
result = ast.literal_eval(test.decode())
最好的方法是将这个sub-python脚本称为模块。在这种情况下,您不必运行子进程/序列化/反序列化。只需导入子模块,调用函数并获得真正的list
。当然,在ssh
子进程调用的情况下,你不能。
然而,您可以通过传递打开的python文件的文件句柄来执行,将输出提供给{{1}的输入,从而改善这种丑陋且易于代码注入/不安全的check_output
调用需要shell=True
并使用字符串列表而不是字符串作为参数:
check_output
后面是解码+评估代码。