subprocess和psutil:如何从subprocess.check_output中获取列表?

时间:2018-06-14 17:44:11

标签: python python-3.x ssh subprocess psutil

我愿意确定一堆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命令。

感谢您的帮助!

1 个答案:

答案 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

后面是解码+评估代码。