Python 使用 psutil 获取系统信息

  1. 安装
  2. 获取 CPU 信息
  3. 获取内存信息
  4. 获取磁盘信息
  5. 获取网络信息
  6. 获取进程信息

GitHub 地址:https://github.com/giampaolo/psutil

文档地址:https://psutil.readthedocs.io/en/latest/#

psutil - 廖雪峰的官方网站:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001511052957192bb91a56a2339485c8a8c79812b400d49000

安装

pip install psutil

获取 CPU 信息

>>> import psutil
>>> psutil.cpu_count() # CPU逻辑数量
8
>>> psutil.cpu_count(logical=False) # CPU物理核心
4
# 4说明是四核超线程, 8则是8核非超线程

统计 CPU 的用户/系统/空闲时间:

>>> psutil.cpu_times()
scputimes(user=8526.40625, system=9484.421875, idle=1319748.125, interrupt=257.640625, dpc=321.4375)

再实现类似 top 命令的 CPU 使用率,每秒刷新一次,累计 10 次:

>>> for x in range(10):
        psutil.cpu_percent(interval=1, percpu=True)


[17.9, 4.7, 6.2, 4.7, 18.8, 6.2, 15.6, 1.6]
[6.2, 4.7, 6.2, 1.6, 18.8, 1.6, 14.1, 4.7]
[10.8, 9.4, 9.4, 9.4, 12.5, 6.2, 20.3, 7.8]
[9.2, 4.7, 4.7, 0.0, 9.4, 1.6, 9.4, 3.1]
[3.1, 10.9, 4.7, 0.0, 17.2, 4.7, 10.9, 6.2]
[10.9, 4.7, 10.9, 0.0, 21.9, 1.6, 12.5, 7.7]
[10.6, 6.2, 7.8, 9.4, 9.4, 7.8, 10.9, 1.6]
[12.1, 14.1, 9.2, 1.6, 15.6, 1.6, 7.8, 3.1]
[10.4, 3.1, 3.1, 1.6, 7.8, 4.7, 9.4, 3.1]
[13.6, 4.7, 3.1, 1.6, 10.9, 4.7, 15.6, 4.7]

获取内存信息

使用 psutil 获取物理内存和交换内存信息,分别使用:

>>> psutil.virtual_memory()
svmem(total=34192486400, available=24073785344, percent=29.6, used=10118701056, free=24073785344)
>>> psutil.swap_memory()
sswap(total=39292760064, used=22848684032, free=16444076032, percent=58.1, sin=0, sout=0)

返回的是字节为单位的整数,可以看到,总内存大小是 34192486400 ≈ 32 GB,已用 10118701056 = 9.4 GB,使用了29.6%。

而交换区大小是 39292760064。

获取磁盘信息

可以通过 psutil 获取磁盘分区、磁盘使用率和磁盘 IO 信息:

>>> psutil.disk_partitions() # 磁盘分区信息
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed')]
>>> psutil.disk_usage('/') # 磁盘使用情况
sdiskusage(total=499581448192, used=127942549504, free=371638898688, percent=25.6)
>>> psutil.disk_io_counters() # 磁盘IO
sdiskio(read_count=304774, write_count=1072936, read_bytes=9930344448, write_bytes=21363569152, read_time=241, write_time=363)

可以看到,磁盘'/'的总容量是 499581448192 = 465 GB,使用了25.6%。文件格式是 HFS,opts 中包含 rw 表示可读写。

获取网络信息

psutil 可以获取网络接口和网络连接信息:

>>> psutil.net_io_counters() # 获取网络读写字节/包的个数
snetio(bytes_sent=137762746, bytes_recv=4244858457, packets_sent=1678156, packets_recv=3637825, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_if_addrs() # 获取网络接口信息
{
  '以太网': [snicaddr(family = <AddressFamily.AF_LINK: -1 > , address = 'FC-AA-14-9C-5C-9F', netmask = None, broadcast = None, ptp = None), snicaddr(family = <AddressFamily.AF_INET: 2 > , address = '192.168.81.88', netmask = '255.255.255.0', broadcast = None, ptp = None), snicaddr(family = <AddressFamily.AF_INET6: 23 > , address = 'fe80::5c91:1b95:bbd8:eba9', 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)]
}
>>> psutil.net_if_stats() # 获取网络接口状态
{
  '以太网': snicstats(isup = True, duplex = <NicDuplex.NIC_DUPLEX_FULL: 2 > , speed = 100, mtu = 1500),
  'Loopback Pseudo-Interface 1': snicstats(isup = True, duplex = <NicDuplex.NIC_DUPLEX_FULL: 2 > , speed = 1073, mtu = 1500)
}

要获取当前网络连接信息,使用 net_connections():

你可能会得到一个 AccessDenied 错误,原因是 psutil 获取信息也是要走系统接口,而获取网络连接信息需要 root 权限。

>>> psutil.net_connections()
[
    sconn(fd=83, family=<AddressFamily.AF_INET6: 30>, type=1, laddr=addr(ip='::127.0.0.1', port=62911), raddr=addr(ip='::127.0.0.1', port=3306), status='ESTABLISHED', pid=3725),
    ...
    sconn(fd=27, family=<AddressFamily.AF_INET: 2>, type=2, ..., pid=1)
]

获取进程信息

通过 psutil 可以获取到所有进程的详细信息:

>>> psutil.pids() # 所有进程ID
[0, 4, 120, 428, 612, 720, ..., 21396, 3312, 18888, 10804]
>>> p = psutil.Process(10804) # 获取指定进程ID=3776,其实就是当前Python交互环境
>>> p
psutil.Process(pid=10804, name='python.exe', started='15:09:40')
>>> p.name() # 进程名称
'python.exe'
>>> p.exe() # 进程exe路径
'C:\\Program Files\\Python36\\python.exe'
>>> p.cwd() # 进程工作目录
'C:\\Users\\Administrator'
>>> p.cmdline() # 进程启动的命令行
['C:\\Program Files\\Python36\\python.exe']
>>> p.ppid() # 父进程ID
3312
>>> p.parent() # 父进程
psutil.Process(pid=3312, name='powershell.exe', started='15:08:42')
>>> p.children() # 子进程列表
[]
>>> p.status() # 进程状态
'running'
>>> p.username() # 进程用户名
'DESKTOP-4P1JQ5U\\Administrator'
>>> p.create_time() # 进程创建时间
1546240180.0
>>> p.terminal() # 进程终端(Linux下存在)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Process' object has no attribute 'terminal'
>>> p.cpu_times() # 进程使用的CPU时间
pcputimes(user=0.0625, system=0.0625, children_user=0.0, children_system=0.0)
>>> p.cpu_percent(None) # 进程占用的CPU,第一次调用得到的是0,第二次调用得到的是从上一次调用同一个进程对象的cpu_percent方法到第二次调用之间的cpu利用率
0.0
>>> p.memory_info() # 进程使用的内存
pmem(rss=15048704, vms=8454144, num_page_faults=5448, peak_wset=15052800, wset=15048704, peak_paged_pool=190608, paged_pool=190328, peak_nonpaged_pool=14016, nonpaged_pool=13304, pagefile=8454144, peak_pagefile=8572928, private=8454144)
>>> p.memory_percent()# 进程占用的内存
0.04451485575497663
>>> p.open_files() # 进程打开的文件
[popenfile(path='C:\\Program Files\\WindowsApps\\Microsoft.LanguageExperiencePackzh-CN_17763.6.11.0_neutral__8wekyb3d8bbwe\\Windows\\System32\\zh-CN\\KernelBase.dll.mui', fd=-1), popenfile(path='C:\\Program Files\\WindowsApps\\Microsoft.LanguageExperiencePackzh-CN_17763.6.11.0_neutral__8wekyb3d8bbwe\\Windows\\System32\\zh-CN\\kernel32.dll.mui', fd=-1)]
>>> p.connections() # 进程相关网络连接
[]
>>> p.num_threads() # 进程的线程数量
5
>>> p.threads() # 所有线程信息
[pthread(id=6312, user_time=0.0625, system_time=0.171875), pthread(id=8484, user_time=0.0, system_time=0.0), pthread(id=12192, user_time=0.0, system_time=0.0), pthread(id=11580, user_time=0.0, system_time=0.0)]
>>> p.environ() # 进程环境变量
{'ALLUSERSPROFILE': 'C:\\ProgramData', ..., 'WINDIR': 'C:\\Windows'}
>>> p.terminate() # 结束进程

psutil还提供了一个 test() 函数,可以模拟出 ps 命令的效果:

>>> psutil.test()
USER         PID %MEM     VSZ     RSS TTY           START    TIME  COMMAND
root           0 24.0 74270628 2016380 ?             Nov18   40:51  kernel_task
root           1  0.1 2494140    9484 ?             Nov18   01:39  launchd
root          44  0.4 2519872   36404 ?             Nov18   02:02  UserEventAgent
root          45    ? 2474032    1516 ?             Nov18   00:14  syslogd
root          47  0.1 2504768    8912 ?             Nov18   00:03  kextd
root          48  0.1 2505544    4720 ?             Nov18   00:19  fseventsd
_appleeven    52  0.1 2499748    5024 ?             Nov18   00:00  appleeventsd
root          53  0.1 2500592    6132 ?             Nov18   00:02  configd
...

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:Python 使用 psutil 获取系统信息

文章字数:1.6k

本文作者:Bin

发布时间:2018-12-31, 15:57:22

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2018/12/31/Python/Python%20%E4%BD%BF%E7%94%A8%20psutil%20%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录