三种用Python获取Linux资源信息的方法

三种用Python获取Linux资源信息的方法[Python常见问题]

方法一:psutil模块

#!usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import psutil
class NodeResource(object):
    def get_host_info(self):
        host_name = socket.gethostname()
        return {"host_name":host_name}

    def get_cpu_state(self):
        cpu_count = psutil.cpu_count(logical=False)
        cpu_percent =(str)(psutil.cpu_percent(1))+"%"
        return {"cpu_count":cpu_count,"cpu_percent":cpu_percent}

    def get_memory_state(self):
        mem = psutil.virtual_memory()
        mem_total = mem.total / 1024 / 1024
        mem_free = mem.available /1024/1024
        mem_percent = "%s%%"%mem.percent
        return {"mem_toal":mem_total,"mem_free":mem_free,"mem_percent":mem_percent}

    def get_disk_state(self):
        disk_stat = psutil.disk_usage("/")
        disk_total = disk_stat.total
        disk_free = disk_stat.free
        disk_percent = "%s%%"%disk_stat.percent
        return {"mem_toal": disk_total, "mem_free": disk_free, "mem_percent": disk_percent}

psutil

方法二:、proc

#!usr/bin/env python
# -*- coding: utf-8 -*-
#Python学习交流群:778463939

import time
import os
from multiprocessing import cpu_count

class NodeResource(object):


    def usage_percent(self,use, total):
        # 返回百分占比
        try:
            ret = int(float(use)/ total * 100)
        except ZeroDivisionError:
            raise Exception("ERROR - zero division error")
        return "%s%%"%ret

    @property
    def cpu_stat(self,interval = 1):

        cpu_num = cpu_count()
        with open("/proc/stat", "r") as f:
            line = f.readline()
            spl = line.split(" ")
            worktime_1 = sum([int(i) for i in spl[2:]])
            idletime_1 = int(spl[5])
        time.sleep(interval)
        with open("/proc/stat", "r") as f:
            line = f.readline()
            spl = line.split(" ")
            worktime_2 = sum([int(i) for i in spl[2:]])
            idletime_2 = int(spl[5])

        dworktime = (worktime_2 - worktime_1)
        didletime = (idletime_2 - idletime_1)
        cpu_percent = self.usage_percent(dworktime - didletime,didletime)
        return {"cpu_count":cpu_num,"cpu_percent":cpu_percent}

    @property
    def disk_stat(self):
        hd = {}
        disk = os.statvfs("/")
        hd["available"] = disk.f_bsize * disk.f_bfree
        hd["capacity"] = disk.f_bsize * disk.f_blocks
        hd["used"] =  hd["capacity"] - hd["available"]
        hd["used_percent"] = self.usage_percent(hd["used"], hd["capacity"])
        return hd

    @property
    def memory_stat(self):
        mem = {}
        with open("/proc/meminfo") as f:
            for line in f:
                line = line.strip()
                if len(line) < 2: continue
                name = line.split(":")[0]
                var = line.split(":")[1].split()[0]
                mem[name] = long(var) * 1024.0
            mem["MemUsed"] = mem["MemTotal"] - mem["MemFree"] - mem["Buffers"] - mem["Cached"]
        mem["used_percent"] = self.usage_percent(mem["MemUsed"],mem["MemTotal"])
        return {"MemUsed":mem["MemUsed"],"MemTotal":mem["MemTotal"],"used_percent":mem["used_percent"]}


nr = NodeResource()

print nr.cpu_stat
print "=================="
print nr.disk_stat
print "=================="
print nr.memory_stat

proc

方法三:subprocess

from subprocess import Popen, PIPE
import os,sys

""" 获取 ifconfig 命令的输出 """
def getIfconfig():
    p = Popen(["ifconfig"], stdout = PIPE)
    data = p.stdout.read()
    return data

""" 获取 dmidecode 命令的输出 """
def getDmi():
    p = Popen(["dmidecode"], stdout = PIPE)
    data = p.stdout.read()
    return data

""" 根据空行分段落 返回段落列表"""
def parseData(data):
    parsed_data = []
    new_line = ""
    data = [i for i in data.split("
") if i]
    for line in data:
        if line[0].strip():
            parsed_data.append(new_line)
            new_line = line + "
"
        else:
            new_line += line + "
"
    parsed_data.append(new_line)
    return [i for i in parsed_data if i]

""" 根据输入的段落数据分析出ifconfig的每个网卡ip信息 """
def parseIfconfig(parsed_data):
    dic = {}
    parsed_data = [i for i in parsed_data if not i.startswith("lo")]
    for lines in parsed_data:
        line_list = lines.split("
")
        devname = line_list[0].split()[0]
        macaddr = line_list[0].split()[-1]
        ipaddr  = line_list[1].split()[1].split(":")[1]
        break
    dic["ip"] = ipaddr
    return dic

""" 根据输入的dmi段落数据 分析出指定参数 """
def parseDmi(parsed_data):
    dic = {}
    parsed_data = [i for i in parsed_data if i.startswith("System Information")]
    parsed_data = [i for i in parsed_data[0].split("
")[1:] if i]
    dmi_dic = dict([i.strip().split(":") for i in parsed_data])
    dic["vender"] = dmi_dic["Manufacturer"].strip()
    dic["product"] = dmi_dic["Product Name"].strip()
    dic["sn"] = dmi_dic["Serial Number"].strip()
    return dic

""" 获取Linux系统主机名称 """
def getHostname():
    with open("/etc/sysconfig/network") as fd:
        for line in fd:
            if line.startswith("HOSTNAME"):
                hostname = line.split("=")[1].strip()
                break
    return {"hostname":hostname}

""" 获取Linux系统的版本信息 """
def getOsVersion():
    with open("/etc/issue") as fd:
        for line in fd:
            osver = line.strip()
            break
    return {"osver":osver}

""" 获取CPU的型号和CPU的核心数 """
def getCpu():
    num = 0
    with open("/proc/cpuinfo") as fd:
        for line in fd:
            if line.startswith("processor"):
                num += 1
            if line.startswith("model name"):
                cpu_model = line.split(":")[1].strip().split()
                cpu_model = cpu_model[0] + " " + cpu_model[2]  + " " + cpu_model[-1]
    return {"cpu_num":num, "cpu_model":cpu_model}

""" 获取Linux系统的总物理内存 """
def getMemory():
    with open("/proc/meminfo") as fd:
        for line in fd:
            if line.startswith("MemTotal"):
                mem = int(line.split()[1].strip())
                break
    mem = "%.f" % (mem / 1024.0) + " MB"
    return {"Memory":mem}

if __name__ == "__main__":
    dic = {}
    data_ip = getIfconfig()
    parsed_data_ip = parseData(data_ip)
    ip = parseIfconfig(parsed_data_ip)
    
    data_dmi = getDmi()
    parsed_data_dmi = parseData(data_dmi)
    dmi = parseDmi(parsed_data_dmi)

    hostname = getHostname()
    osver = getOsVersion()
    cpu = getCpu()
    mem = getMemory()
    
    dic.update(ip)
    dic.update(dmi)
    dic.update(hostname)
    dic.update(osver)
    dic.update(cpu)
    dic.update(mem)

    """ 将获取到的所有数据信息并按简单格式对齐显示 """
    for k,v in dic.items():
        print "%-10s:%s" % (k, v)

pipe,poen
from subprocess import Popen, PIPE
import time

""" 获取 ifconfig 命令的输出 """
# def getIfconfig():
#     p = Popen(["ipconfig"], stdout = PIPE)
#     data = p.stdout.read()
#     data = data.decode("cp936").encode("utf-8")
#     return data
#
# print(getIfconfig())

p = Popen(["top -n 2 -d |grep Cpu"],stdout= PIPE,shell=True)
data = p.stdout.read()
info = data.split("
")[1]
info_list =  info.split()
cpu_percent ="%s%%"%int(float(info_list[1])+float(info_list[3]))
print cpu_percent

top+Popen
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 三种用Python获取Linux资源信息的方法