python数据可视化开发(3):使用psutil和socket模块获取电脑系统信息(Mac地址、IP地址、主机名、系统用户、硬盘、CPU、内存、网络)
·
系列文章目录
- python开发低代码数据可视化大屏:pandas.read_excel读取表格
- python实现直接读取excle数据实现的百度地图标注
- python数据可视化开发(1):Matplotlib库基础知识
- python数据可视化开发(2):pandas读取Excel的数据格式处理
前言
psutil是一个开源切跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如CPU,内存,磁盘,网络等。此外,psutil还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。而且psutil还提供了许多命令行工具提供的功能,包括:ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。
1.psutil模块说明
psutil包含了异常、类、功能函数和常量,其中功能函数用来获取系统的信息,如CPU、磁盘、内存、网络等。类用来实现进程的管理功能。根据函数的功能,主要分为CPU、磁盘、内存、网络几类,下面将会总几个方面来介绍psutil提供的功能函数。
Memory内存相关
函数 | 描述 |
---|---|
virtual_memory() | 以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。 |
swap_memory() | 以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出。 |
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频率 |
Disk相关
函数 | 描述 |
---|---|
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所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。 |
Network相关
函数 | 描述 |
---|---|
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() | 以时间戳的形式返回系统的启动时间 |
进程管理
函数 | 描述 |
---|---|
psutil.pids() | 以列表的形式返回当前正在运行的进程 |
psutil.pid_exists(1) | 判断给点定的pid是否存在 |
psutil.process_iter() | 迭代当前正在运行的进程,返回的是每个进程的Process对象 |
psutil.Process() | 对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。 |
2.封装函数
import json
import psutil
import datetime
import socket
import uuid
# 获取Mac地址
def get_mac_address():
mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
return ":".join([mac[e:e + 2] for e in range(0, 11, 2)])
# 磁盘 磁盘的使用量等等
def get_my_computer():
# 获取主机名
hostname = socket.gethostname()
# 获取IP
ip = socket.gethostbyname(hostname)
# 系统用户
users_list = ",".join([u.name for u in psutil.users()])
# print(u"当前有%s个用户,分别是%s" % (users_count, users_list))
# 系统启动时间
start_time = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
sys_info = {"hostname": hostname, "ip": ip, "mac": get_mac_address(), "user": users_list, "start_time": start_time}
# 01.cpu信息
cpu1 = psutil.cpu_count()
cpu2 = str(psutil.cpu_percent(interval=1)) + '%'
# print(u"物理CPU个数 %s" % psutil.cpu_count(logical=False))
cpu = {"amount": cpu1, "rate": cpu2}
# 02.内存信息
mem = psutil.virtual_memory()
mem_total = round(mem.total / 1024 / 1024 / 1024, 2)
mem_free = round(mem.free / 1024 / 1024 / 1024, 2)
mem_percent = str(mem.percent) + '%'
mem_used = round(mem.used / 1024 / 1024 / 1024, 2)
ddr = {"total": mem_total, "free": mem_free, "rate": mem_percent, "used": mem_used}
# 03.磁盘信息(磁盘空间使用占比)
io = psutil.disk_partitions()
disk = []
for i in io:
# print(i.device)
o = psutil.disk_usage(i.device)
disk_data = {"disk_name": i.device,
"total": round(o.total / (1024.0 * 1024.0 * 1024.0),1),
"used": round(o.used / (1024.0 * 1024.0 * 1024.0),1),
"surplus": round(o.free / (1024.0 * 1024.0 * 1024.0),1),
"rate": psutil.disk_usage(i.device).percent}
disk.append(disk_data)
# 04.网卡,可以得到网卡属性,连接数,当前流量等信息
net_info = psutil.net_io_counters()
bytes_sent = '{0:.2f}'.format(net_info.bytes_recv / 1024 / 1024) # mb
bytes_rcvd = '{0:.2f}'.format(net_info.bytes_sent / 1024 / 1024)
net = {"bytes_sent": bytes_sent, "bytes_rcvd": bytes_rcvd}
# 数据字典
data = {"sys": sys_info, "cpu": cpu, "ddr": ddr, "disk": disk, "net": net}
return data
数据格式化
调用函数
data = get_my_computer()
re = json.dumps(data)
print(data)
JSON输出数据
{'sys': {'hostname': 'poleung-len', 'ip': '192.168.4.16', 'mac': '4c:79:6e:4f:ff:0f', 'user': 'poleung', 'start_time': '2023-01-24 08:18:44'}, 'cpu': {'amount': 8, 'rate': '32.8%'}, 'ddr': {'total': 15.79, 'free': 4.19, 'rate': '73.5%', 'used': 11.6}, 'disk': [{'disk_name': 'C:\\', 'total': 200.0, 'used': 171.9, 'surplus': 28.1, 'rate': 86.0}, {'disk_name': 'D:\\', 'total': 129.2, 'used': 105.2, 'surplus': 24.0, 'rate': 81.4}, {'disk_name': 'E:\\', 'total': 146.5, 'used': 127.5, 'surplus': 18.9, 'rate': 87.1}], 'net': {'bytes_sent': '927.60', 'bytes_rcvd': '2336.88'}}
总结
对电脑系统信息的读取,涉及到psutil和socket模块。本文是将使用到的信息,封装成单独的函数,然后使用JSON输出,便于后期数据可视化大屏API的对接。后续开发工作的内容包括:
- 系统数据信息入库(pymysql模块)
- 数据图表化展示(matplotlib、pyecharts模块)
- web端数据可视化(flask模块)
- 数据导出(pandas模块)
@漏刻有时
更多推荐
已为社区贡献15条内容
所有评论(0)