psutil 实现主机信息查询系统的源码

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

# 获取当前系统的登录用户数
login_users = len(psutil.users())


def bytes2human(n):
    """
    字节转换工具
    http://code.activestate.com/recipes/578019
    #bytes2human(10000)
    '9.8K'
    #>>> bytes2human(100001221)
    '95.4M'
    :param n:
    :return:
    """

    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    prefix = {}
    for i, s in enumerate(symbols):
       # 0  K
       # 1  M
        prefix[s] = 1 << (i + 1) * 10
       # {"K": 1024,
       #  "M": 1048576,
       #  "Y": ... }
    for s in reversed(symbols):
        if n >= prefix[s]:
            value = float(n) / prefix[s]
            return '{:.1f}{}'.format(value, s)
    return "%sB" % n


# 获取 CPU 信息
def get_cpu():
    # cpu 实例数
    cpu_count = len(psutil.Process().cpu_affinity())

    # 每颗 cpu 的物理核心数
    cpu_py_count = psutil.cpu_count(logical=False)

    # cpu 信息
    cpu_info = psutil.cpu_times_percent(interval=0.1)

    return cpu_count, cpu_py_count, cpu_info


# 打印 CPU 信息
def display_cpu():
    cpu_temple = """
************************** CPU 信息 **************************
CPU 颗数: {cpu_count}       CPU 总使用率: {cpu_time}%
物理核心数: {cpu_py_count}    IO 等待 CPU 空闲率: {io_wait_time}%  
"""

    cpu_count, cpu_py_count, cpu_info = get_cpu()
    import sys
    plf = sys.platform
    print(cpu_temple.format(
        cpu_count=cpu_count,
        cpu_py_count=cpu_py_count,
        cpu_time=cpu_info.user + cpu_info.system,

        # iowait Mac 系统不支持,在 mac 系统下需要把 io_wait_time 赋值为空
        # io_wait_time=""

        io_wait_time=cpu_info.iowait if plf == 'linux' else ''
    ))


def get_mem():
    # 内存信息
    return psutil.virtual_memory()

# mem_info = psutil.virtual_memory()

def display_meme():
    mem_info = get_mem()
    print("*" * 16, "Disk 信息", "*" * 16)
    fileds = ['total', 'free', 'used']
    for name in mem_info._fields:
        # if name != 'percent':
        if name in fileds:
            value = getattr(mem_info, name)
            value = bytes2human(value)
            print("{:<10s} : {}".format(name.capitalize(), value))


# 获取 DISK 信息
def get_disk_part():
    return psutil.disk_partitions(all=False)


def display_disk():
    disk_fields = ("Device", "Total", "Used", "Free", "Use ", "Type", "Mount")
    temple_title = '{:<23s} {:<8} {:<8} {:<8} {:<3s}% {:>8s}  {:>:')
        if inp == 'q':
            sys.exit("系统退出")
        if inp in display_dic.keys():
            # python3.6+
            print(f"{'*' * 10}Python 系统性能信息收集程序")         
            # python3.x
            print("{}Python 系统性能信息收集程序".format('*' * 10))          
            for k, item in display_dic.items():
                print(k, item['title'])
            print()
            exec_func = display_dic[inp]['func']
            exec_func()
            print()

if __name__ == "__main__":
    man()


###########################

"""
{'eth0': snetio(bytes_sent=101643418, bytes_recv=86163253, packets_sent=286285, packets_recv=326059, errin=0, errout=0, dropin=0, dropout=0),
 'lo': snetio(bytes_sent=224151, bytes_recv=224151, packets_sent=3347, packets_recv=3347, errin=0, errout=0, dropin=0, dropout=0)}
"""

"""
psutil.net_if_addrs()
将与安装在系统上的每个NIC(网络接口卡)关联的地址作为字典返回,该字典的关键字是NIC名称,值是分配给NIC的每个地址的命名元组列表。每个命名的元组包括5个字段:

系列:地址系列, AF_INET, AF_INET6 或psutil.AF_LINK,指MAC地址。
地址:主NIC地址(始终设置)。
网络掩码:网络掩码地址(可能是None)。
广播:广播地址(可能None)。
ptp:代表“点对点”; 它是点对点接口(通常是VPN)的目标地址。广播和PT是互斥的。可能是None。
"""

"""
psutil.net_if_stats()
{'eth0': snicstats(isup=True, duplex=, speed=1000, mtu=1500),
 'lo': snicstats(isup=True, duplex=, speed=0, mtu=65536)}
将安装在系统上的每个NIC(网络接口卡)的信息作为字典(其关键字是NIC名称和值)返回,其中包含以下字段的命名元组:

isup:表示NIC是否启动并运行的布尔值。  这里我们只关心 是否是启动状态
duplex:双工通信类型; 它可以是NIC_DUPLEX_FULL,NIC_DUPLEX_HALF或者 NIC_DUPLEX_UNKNOWN。
speed:以兆位(MB)表示的NIC速度,如果无法确定(例如'localhost'),则将其设置为0。
mtu:NIC的最大传输单位,以字节表示。
"""

"""
我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,
它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信
python 的 socket 包中有 网卡接口的类型,利用这个可以实现一个映射关系

socket.AF_INET = 
psutil.AF_LINK = 


"""

你可能感兴趣的:(psutil 实现主机信息查询系统的源码)