更便利的获取主机信息--psutil模块介绍

简介

 psutil是一个开源切跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如CPU,内存,磁盘,网络等。此外,psutil还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。而且psutil还提供了许多命令行工具提供的功能,包括:ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。

psutil是一个跨平台的库,在官方网站上查到其支持如下操作系统。

Linux
Windows
OSX
FreeBSD
OpenBSD
NetBSD
Sun Solaris
AIX
Works with Python versions from 2.6 to 3.X.

psutil包含了异常、类、功能函数和常量,其中功能函数用来获取系统的信息,如CPU、磁盘、内存、网络等。类用来实现进程的管理功能

功能函数

一、CPU 相关操作

函数描述
psutil.cpu_count()
cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数。
psutil.cpu_percent()cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0时,则阻塞时显示interval执行的时间内的平均利用率
psutil.cpu_times()cpu_times(,[percpu]):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=True表示获取每个CPU的时间花费
psutil.cpu_times_percent()cpu_times_percent(,[percpu]):功能和cpu_times大致相同,看字面意思就能知道,该函数返回的是耗时比例。
psutil.cpu_stats()cpu_stats()以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数。
psutil.cpu_freq()cpu_freq([percpu]):返回cpu频率

示例代码

print('CPU:逻辑核心数量:', psutil.cpu_count())  # CPU:逻辑核心数量: 8
print('CPU物理核心数量:', psutil.cpu_count(logical=False))  # CPU物理核心数量: 4
print('CPU使用率:', psutil.cpu_percent())  # CPU使用率: 25.0
print('每个CPU的使用率:', psutil.cpu_percent(percpu=True))  # 每个CPU的使用率: [0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0]

二、内存相关操作

函数描述
virtual_memory()
以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。
swap_memory()以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出。

示例代码

# 将字节转化为人能看懂的显示方式。
def bytes2human(n):
    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    prefix = {}
    for i, s in enumerate(symbols):
        prefix[s] = 1 << (i + 1) * 10  # 二进制操作,左移十位。2的10次方。
    for s in reversed(symbols):
        if n >= prefix[s]:
            value = float(n) / prefix[s]
            return '%.1f%s' % (value, s)
    return '%sB' % n


# 内存信息
print('virtual memory:', psutil.virtual_memory()) # svmem(total=17061699584, available=10758160384, percent=36.9, used=6303539200, free=10758160384)
# 内存总量
print('total virtual memory:', bytes2human(psutil.virtual_memory().total))  # total virtual memory: 15.9G
# 交换内存信息
print('swap memory:', psutil.swap_memory()) # sswap(total=19611836416, used=7700779008, free=11911057408, percent=39.3, sin=0, sout=0)

三、磁盘相关操作

函数描述
psutil.disk_io_counters()
disk_io_counters([perdisk]):以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等。
当perdisk的值为True,则分别列出单个磁盘的统计信息(字典:key为磁盘名称,value为统计的namedtuple)。
psutil.disk_partitions()disk_partitions([all=False]):以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。
当all等于True时,返回包含/proc等特殊文件系统的挂载信息
psutil.disk_usage()disk_usage(path):以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。

示例代码

    # 查看所有已挂在的磁盘
    print('all disk:', psutil.disk_partitions())
    # all disk:
    # [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'),
    # sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'),
    # sdiskpart(device='F:\\', mountpoint='F:\\', fstype='NTFS', opts='rw,fixed')]

    # 使用列表表达式查询指定挂载点信息
    print('查看C\\挂载点下面的盘:', [device for device in psutil.disk_partitions() if device.mountpoint == 'C:\\'])
    # 查看C\挂载点下面的盘: [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed')]

    # # 查看磁盘使用情况
    print('磁盘使用率:', psutil.disk_usage('c:\\'))
    # 磁盘使用率: sdiskusage(total=126816112640, used=80271691776, free=46544420864, percent=63.3)

    # # 查看磁盘io统计汇总
    print('io统计:', psutil.disk_io_counters())
    # io统计: sdiskio(read_count=1225534, write_count=1225945, read_bytes=31532467712,
    # write_bytes=23405083136, read_time=1317, write_time=715)

    print('读取字节总计:', bytes2human(psutil.disk_io_counters().read_bytes))  # 读取字节总计: 29.4G
    print('写入字节总计:', bytes2human(psutil.disk_io_counters().write_bytes))  # 写入字节总计: 21.9G

    # # 分别列出单个磁盘的统计信息
    print('io统计(分磁盘):', psutil.disk_io_counters(perdisk=True))
    # io统计(分磁盘):
    # {'PhysicalDrive0': sdiskio(read_count=48684, write_count=21848, read_bytes=279104000,
    # write_bytes=246022144, read_time=102, write_time=87),
    # 'PhysicalDrive1': sdiskio(read_count=1177273, write_count=1206106, read_bytes=31260236800,
    # write_bytes=23359371776, read_time=1216, write_time=629)}

四、网络相关操作

函数详情
psutil.net_io_counter([pernic])
以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。
psutil.net_connections([kind])以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含fd, family, type, laddr, raddr, status, pid等信息。kind表示过滤的连接类型,支持的值如下:(默认为inet)
psutil.net_if_addrs()以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。
psutil.net_if_stats()返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu。
psutil.users()以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息
psutil.boot_time()以时间戳的形式返回系统的启动时间

示例代码

    print('网卡信息统计:', psutil.net_io_counters())
    # 网卡信息统计: snetio(bytes_sent=2449953, bytes_recv=22943180, packets_sent=23457,
    # packets_recv=23282, errin=0, errout=0, dropin=0, dropout=0)

    # # 查看网卡配置信息
    print('网卡配置:', psutil.net_if_addrs())
    # 网卡配置: {'以太网 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>,
    # address='84-A9-3E-1E-DD-D2', netmask=None, broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET: 2>,
    # address='169.254.196.149', netmask='255.255.0.0', broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>,
    # address='fe80::3583:fffa:84b0:c495', netmask=None, broadcast=None, ptp=None)],
    #  '本地连接* 1': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='DC-8B-28-21-10-89',
    # netmask=None, broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.133.102',
    #  netmask='255.255.0.0', broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::59bb:52ef:6cce:8566',
    # netmask=None, broadcast=None, ptp=None)],
    # '本地连接* 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='DE-8B-28-21-10-88',
    # netmask=None, broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.84.223',
    # netmask='255.255.0.0', broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::7d29:9b3a:9534:54df',
    # netmask=None, broadcast=None, ptp=None)],
    # 'WLAN 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='DC-8B-28-21-10-88',
    # netmask=None, broadcast=None, ptp=None),
    #  snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.43.4',
    #  netmask='255.255.255.0', broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>, address='2408:84e1:ef:e57d:95a7:de71:979:32bf',
    #  netmask=None, broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>, address='2408:84e1:ef:e57d:e5ef:b992:4e09:1ea',
    # netmask=None, broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::95a7:de71:979:32bf',
    # netmask=None, broadcast=None, ptp=None)],
    # '蓝牙网络连接 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='DC-8B-28-21-10-8C',
    #  netmask=None, broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.161.85',
    # netmask='255.255.0.0', broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::28:ccf6:c2b4:a155',
    # netmask=None, broadcast=None, ptp=None)],
    # 'Loopback Pseudo-Interface 1': [snicaddr(family=<AddressFamily.AF_INET: 2>,
    # address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None),
    # snicaddr(family=<AddressFamily.AF_INET6: 23>, address='::1', netmask=None, broadcast=None, ptp=None)]}

    # # 查看当前登录用户信息
    print('当前用户:', psutil.users())
    # 当前用户: [suser(name='Administrator', terminal=None, host=None, started=1603704608.9219046, pid=None)]

五、进程相关操作

函数详情
psutil.pids()
以列表的形式返回当前正在运行的进程
psutil.pid_exists(1)判断给点定的pid是否存在
psutil.process_iter()迭代当前正在运行的进程,返回的是每个进程的Process对象
psutil.Process()对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。

示例代码

 # # 以列表形式查看正在运行的进程PID
    print('所有进程的pid', psutil.pids())
    # 所有进程的pid [0, 4, 120, 228, 352, 500, 512, 528, 676, 692, 788, 792, 864, 872, 1140, 1196, 1212, 1236, 1400,
    # 1408, 1416, 1428, 1440, 1536, 1552, 1560, 1580, 1616, 1728, 1812, 1960, 1980, 2116, 2132, 2140, 2188, 2196,
    # 2232, 2260, 2304, 2440, 2484, 2528, 2556, 2676, 2688, 2700, 2708, 2804, 2920, 2940, 3020, 3116, 3132, 3248,
    # 3304, 3328, 3384, 3540, 3580, 3592, 3600, 3608, 3624, 3736, 3868, 3944, 4136, 4212, 4260, 4412, 4420, 4424,
    # 4684, 4704, 4708, 4724, 4744, 4752, 4760, 4768, 4800, 4812, 4816, 4832, 4872, 4912, 4924, 4940, 4948, 4964,
    # 5008, 5104, 5160, 5172, 5204, 5256, 5708, 5800, 5952, 6204, 6244, 6292, 6376, 6432, 6740, 6852, 7184, 7268,
    # 7336, 7428, 7596, 7652, 7684, 7688, 7704, 7804, 7932, 8028, 8040, 8076, 8160, 8164, 8372, 8380, 8392, 8608,
    # 8660, 9276, 9496, 9564, 9624, 9820, 9904, 10192, 10256, 10336, 10408, 11416, 11552, 11640, 11644, 11700,
    # 11792, 12396, 12404, 12460, 12540, 12904, 12952, 13032, 13600, 13604, 13768, 14116, 14124, 14284, 14476,
    # 14752, 14936, 14992, 15024, 15048, 15364, 15380, 15764, 16036, 16196, 16224, 16536, 17104, 17656, 17924,
    # 18008, 18124, 18136, 18244, 18492, 19680, 20388, 20736, 20804, 21064, 21132, 21208, 21244, 21372, 21384,
    # 21564, 21740, 21780, 22008, 22756, 22776, 23148, 23428, 23896, 23916, 24128, 24212, 24544]

    # # 查看进程运行状态,以布尔形式显示
    print('进程运行状态:', psutil.pid_exists(4))  # 进程运行状态: True

    #  迭代当前正在运行进程,查看列表中前三个实例的信息
    print('展示列表中前三个进程:', list(psutil.process_iter())[:3])
    # 展示列表中前三个进程:
    # [psutil.Process(pid=0, name='System Idle Process', status='running'),
    # psutil.Process(pid=4, name='System', status='running'),
    # psutil.Process(pid=120, name='Registry', status='running', started='2020-10-18 13:36:13')]

    # 通过pid获取进程
    print('当前进程:', psutil.Process(4))
    # 当前进程: psutil.Process(pid=4, name='System', status='running')

    p1 = psutil.Process(4)
    
    
    
    def process_from_name(name):
    process_list = list()
    for p in psutil.process_iter(attrs=['pid', 'name']):
        if name.lower() in p.name().lower():
            process_list.append(p)

    return process_list
    
    # 通过进程名 模糊获取进程
    p_list = process_from_name('pycharm')
    print(p_list)
    # [psutil.Process(pid=8392, name='pycharm64.exe', status='running', started='2020-10-27 10:58:16')]
    if p_list:
        print('当前进程名称:', p_list[0].name())  # 当前进程名称: pycharm64.exe
        print('当前进程bin目录:', p_list[0].exe())  # 当前进程bin目录: C:\Program Files\JetBrains\PyCharm 2018.2.4\bin\pycharm64.exe
        print('当前进程工作目录:', p_list[0].cwd())  # 当前进程工作目录: C:\Users\Administrator\Desktop
        print('当前进程用户名:', p_list[0].username())  # 当前进程用户名: SK-20190819NCCC\Administrator
        print('当前进程父进程:', p_list[0].parent())
        # 当前进程父进程: psutil.Process(pid=24128, name='explorer.exe', status='running', started='2020-10-27 08:37:19')
        
        print('当前进程子进程:', p_list[0].children())
        # 当前进程子进程: [psutil.Process(pid=14752, name='fsnotifier64.exe', status='running', started='2020-10-27 10:58:25'), 
        # psutil.Process(pid=18492, name='winpty-agent.exe', status='running', started='2020-10-27 10:59:49'), 
        # psutil.Process(pid=3036, name='python.exe', status='running', started='11:43:26')]
        print('当前进程CPU占用率:', p_list[0].cpu_percent(interval=1.0))  # 当前进程CPU占用率: 7.8
        print('当前进程CPU亲和度:', p_list[0].cpu_affinity())  # 当前进程CPU亲和度: [0, 1, 2, 3, 4, 5, 6, 7]
        print('当前进程状态:', p_list[0].status())  # 当前进程状态: running
        print('当前进程内存占用率:', p_list[0].memory_percent())  # 当前进程内存占用率: 8.32031754521836
        print('当前进程的内存信息:', p_list[0].memory_info())
        # 当前进程的内存信息: pmem(rss=1420582912, vms=1447464960, num_page_faults=1466333, peak_wset=1430204416,
        # wset=1420582912, peak_paged_pool=615968, paged_pool=589360, peak_nonpaged_pool=134168,
        # nonpaged_pool=91040, pagefile=1447464960, peak_pagefile=1456742400, private=1447464960)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值