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模块

  psutil是一个第三方的开源项目,因此需要安装才能使用。这里利用pip命令进行安装

pip3 install psutil

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

功能函数

  根据函数的功能,这里主要分为以下几类,下面将会从几个维度来说明psutil提供的功能函数。

CPU相关

  cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数。

>>> import psutil
>>> psutil.cpu_count()
8
>>> psutil.cpu_count(logical=False)
4

  cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0时,则阻塞时显示interval执行的时间内的平均利用率

>>> import psutil
>>> psutil.cpu_percent()
6.7
>>> psutil.cpu_percent(percpu=True)
[17.7, 0.9, 11.0, 1.0, 11.1, 0.9, 10.7, 0.9]
>>> psutil.cpu_percent(percpu=True,interval=2)
[16.0, 0.0, 8.5, 1.0, 14.4, 0.5, 9.5, 1.0]

  cpu_time(,[percpu]):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu表示获取每个CPU的时间花费

>>> import psutil
>>> psutil.cpu_times()
scputimes(user=5471.2, nice=0.0, system=5633.92, idle=1295903.87, iowait=2651.2, irq=16.44, softirq=137.87, steal=0.0, guest=0.0)
>>> psutil.cpu_times(percpu=True)
[scputimes(user=2803.53, nice=0.0, system=2824.3, idle=648996.02, iowait=153.71, irq=16.26, softirq=64.71, steal=0.0, guest=0.0),
scputimes(user=2667.74, nice=0.0, system=2809.74, idle=646935.11, iowait=2497.58, irq=0.18, softirq=73.15, steal=0.0, guest=0.0)]
 >>> cpu_time = psutil.cpu_times()
>>> cpu_time.user
5471.57
>>>
# 直接使用.元素的名称就可以获取对应的值

命名元组获取信息的简便方法

  cpu_times_percent(,[percpu]):功能和cpu_times大致相同,看字面意思就能知道,该函数返回的是耗时比例。

>>> import psutil
>>> psutil.cpu_times_percent()
scputimes(user=0.3, nice=0.0, system=0.4, idle=99.0, iowait=0.3, irq=0.0, softirq=0.0, steal=0.0, guest=0.0)
>>> psutil.cpu_times_percent(percpu=True)
[scputimes(user=0.3, nice=0.0, system=0.4, idle=99.3, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0),
scputimes(user=0.3, nice=0.0, system=0.4, idle=98.7, iowait=0.6, irq=0.0, softirq=0.0, steal=0.0, guest=0.0)]

  cpu_stats():以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数。

>>> import psutil
>>> psutil.cpu_stats()
scpustats(ctx_switches=393538808, interrupts=194683724, soft_interrupts=151546977, syscalls=0)

Memory相关

  virtual_memory():以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。

>>> import psutil
>>> psutil.virtual_memory()
svmem(total=1964584960, available=1375827968, percent=30.0, used=432644096,
free=600588288, active=710012928, inactive=484106240, buffers=238247936,
cached=693104640, shared=716800)
 >>> import psutil
>>> 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
... for s in reversed(symbols):
... if n >= prefix[s]:
... value = float(n) / prefix[s]
... return '%.1f%s' % (value,s)
... return '%sB' % n
...
>>> bytes2human(psutil.virtual_memory().total)
'1.8G'
>>>

单位转换

  swap_memory():以命名元组的形式返回swap memory使用情况,包含swap 中页的换入和换出。

>>> import psutil
>>> psutil.swap_memory()
sswap(total=2113925120, used=12206080, free=2101719040, percent=0.6,
sin=29061120, sout=87228416)

Disk相关

  disk_partitions([all=False]):以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。当all等于True时,返回包含/proc等特殊文件系统的挂载信息

>>> import psutil
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/mapper/VolGroup-lv_root', mountpoint='/', fstype='ext4', opts='rw'),
sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext4', opts='rw'),
sdiskpart(device='/dev/mapper/VolGroup-lv_home', mountpoint='/home', fstype='ext4', opts='rw')] # 查询指定挂载点的信息
>>> [ device for device in psutil.disk_partitions() if device.mountpoint == '/' ]
[sdiskpart(device='/dev/mapper/VolGroup-lv_root', mountpoint='/', fstype='ext4', opts='rw')]

  disk_usage(path):以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。

>>> import psutil
>>> psutil.disk_usage('/')
sdiskusage(total=32105152512, used=11395198976, free=19072290816, percent=37.4)

  disk_io_counters([perdisk]):以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等。当perdisk的值为True,则分别列出单个磁盘的统计信息(字典:key为磁盘名称,value为统计的namedtuple)。

 import psutil
>>> psutil.disk_io_counters()
sdiskio(read_count=356568, write_count=12058367, read_bytes=12599494656,
write_bytes=92961665024, read_time=260945, write_time=40815092,
read_merged_count=32656, write_merged_count=6334256, busy_time=4421438)
>>> psutil.disk_io_counters(perdisk=True)
{'sda1': sdiskio(read_count=737, write_count=129, read_bytes=7100416,
write_bytes=5615616, read_time=61, write_time=578, read_merged_count=496,
write_merged_count=5349, busy_time=257), 'sda2': sdiskio(read_count=161575,
write_count=2825934, read_bytes=6296442880, write_bytes=46478901248,
read_time=113557, write_time=1580954, read_merged_count=32160,
write_merged_count=6328960, busy_time=1026283),
'dm-0': sdiskio(read_count=111371, write_count=4944247, read_bytes=2401461248,
write_bytes=28988342272, read_time=117846, write_time=25992150, read_merged_count=0,
write_merged_count=0, busy_time=2924323), 'dm-1': sdiskio(read_count=7482,
write_count=21296, read_bytes=30646272, write_bytes=87228416, read_time=8656,
write_time=55930, read_merged_count=0, write_merged_count=0, busy_time=1326),
'dm-2': sdiskio(read_count=75407, write_count=4267078, read_bytes=3863860224,
write_bytes=17403330560, read_time=20849, write_time=13185771, read_merged_count=0,
write_merged_count=0, busy_time=469527)}

Network相关

  net_io_counter([pernic]):以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。

>>> import psutil
>>> psutil.net_io_counters()
snetio(bytes_sent=428286398, bytes_recv=542982044, packets_sent=3768555,
packets_recv=4169425, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_io_counters(pernic=True)
{'lo': snetio(bytes_sent=339700487, bytes_recv=339700487, packets_sent=3363412,
packets_recv=3363412, errin=0, errout=0, dropin=0, dropout=0), 'eth0':
snetio(bytes_sent=88616264, bytes_recv=203314200, packets_sent=405585,
packets_recv=806516, errin=0, errout=0, dropin=0, dropout=0), 'virbr0': snetio(bytes_sent=0,
bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
'virbr0-nic': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0,
errout=0, dropin=0, dropout=0)}

  net_connections([kind]):以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含fd, family, type, laddr, raddr, status, pid等信息。kind表示过滤的连接类型,支持的值如下:(默认为inet)

    - inet:IPv4 and IPv6
    - inet4:IPv4
    - inet6:IPv6
    - tcp:TCP
    - tcp4:TCP over IPv4
    - tcp6:TCP over IPv6
    - udp:UDP
    - udp4:UDP over IPv4
    - udp6:UDP over IPv6
    - unix:UNIX socket (both UDP and TCP protocols)
    - all:the sum of all the possible families and protocols

>>> import psutil
>>> psutil.net_connections()
[sconn(fd=6, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>,
laddr=addr(ip='0.0.0.0', port=8080), raddr=(), status='LISTEN', pid=21834),
sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>,
laddr=addr(ip='0.0.0.0', port=22), raddr=(), status='LISTEN', pid=8971),
sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>,
laddr=addr(ip='127.0.0.1', port=10050), raddr=addr(ip='127.0.0.1', port=46710),
status='TIME_WAIT', pid=None),

  net_if_addrs():以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。

>>> psutil.net_if_addrs()
{'lo': [snic(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None),
snic(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
snic(family=<AddressFamily.AF_PACKET: 17>, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)],
'eth0': [snic(family=<AddressFamily.AF_INET: 2>, address='10.0.0.3', netmask='255.255.255.0', broadcast='10.0.0.255', ptp=None),
snic(family=<AddressFamily.AF_INET6: 10>, address='fe80::21c:42ff:fe52:ae47%eth0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
snic(family=<AddressFamily.AF_PACKET: 17>, address='00:1c:42:52:ae:47', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)],
'virbr0': [snic(family=<AddressFamily.AF_INET: 2>, address='192.168.122.1', netmask='255.255.255.0', broadcast='192.168.122.255', ptp=None),
snic(family=<AddressFamily.AF_PACKET: 17>, address='52:54:00:04:87:ce', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)],
'virbr0-nic': [snic(family=<AddressFamily.AF_PACKET: 17>, address='52:54:00:04:87:ce', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}

  net_if_stats():返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu。

>>> import psutil
>>> psutil.net_if_stats()
{'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536),
'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500),
'virbr0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500),
'virbr0-nic': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=10, mtu=1500)}
>>>

Other

  users():以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息

>>> import psutil
>>> psutil.users()
[suser(name='root', terminal='tty1', host='', started=1513498496.0, pid=9327),
suser(name='root', terminal='pts/0', host='10.0.0.2', started=1515335808.0, pid=30838),
suser(name='root', terminal='pts/2', host='10.0.0.2', started=1515324032.0, pid=21939)] # start 表示登陆的时间(时间戳格式)

  boot_time():以时间戳的形式返回系统的启动时间

>>> import psutil
>>> psutil.boot_time()
1514678349.0 
 >>> import datetime
>>> import psutil
>>> datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H: %M: %S")

转换为人类可读时间

psutil进程管理

psutil还提供了作为进程管理的功能函数,包括获取进程列表,判断是否存在。

  Process类:对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。

>>> import psutil
>>> init_process = psutil.Process(1)
>>> init_process
psutil.Process(pid=1, name='launchd', started='20:41:22') # 进程id、名称、启动时间

Process类提供了很多其他用来获取进程相关信息的方法

  • name:获取进程的名称
  • cmdline:获取启动进程的命令行参数
  • create_time:获取进程的创建时间(时间戳格式)
  • num_fds:进程打开的文件个数
  • num_threads:进程的子进程个数
  • is_running:判断进程是否正在运行
  • send_signal:给进程发送信号,类似与os.kill等
  • kill:发送SIGKILL信号结束进程
  • terminate:发送SIGTEAM信号结束进程
>>> import psutil
>>> process = psutil.Process(3297)
>>> process.name()
'Google Chrome Helper'
>>> process.create_time()
1519832141.532822
>>> process.num_fds()
22
>>> process.num_threads()
19

  pids:以列表的形式返回当前正在运行的进程

  pid_exists:判断给点定的pid是否存在

  process_iter:迭代当前正在运行的进程,返回的是每个进程的Process对象

>>> psutil.pids()
[3373, 3372, 3365, 3364, 3363, 3361, 3360, 3358, 3355, 3351, 3335, 3301, 3299, 3297, 3291, 3290, 3289, 3279, 3278, 3274, 3251, 3248, 3247, 3246, 3244, 3242, 3241, 3225, 3209, 3198, 3194, 3193, 3101, 2828, 2816, 2805, 2802, 2799, 2797, 2767, 2497, 2441, 2437, 2343, 2333, 2330, 2287, 2283, 2258, 2257, 2251, 2248, 2247, 2246, 2245, 2241, 2240, 2238, 2231, 2225]
>>> psutil.pid_exists(12)
False
>>> list(psutil.process_iter())[:5]
[psutil.Process(pid=0, name='kernel_task', started='20:41:22'), psutil.Process(pid=1, name='launchd', started='20:41:22'), psutil.Process(pid=48, name='UserEventAgent', started='20:41:27'), psutil.Process(pid=50, name='uninstalld', started='20:41:27'), psutil.Process(pid=51, name='kextd', started='20:41:27')] # 每个都是一个Process对象
>>>  

Python模块学习 - psutil的更多相关文章

  1. 【目录】Python模块学习系列

    目录:Python模块学习笔记 1.Python模块学习 - Paramiko  - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...

  2. 【转】Python模块学习 - fnmatch & glob

    [转]Python模块学习 - fnmatch & glob 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特 ...

  3. Python模块学习filecmp文件比较

    Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...

  4. python模块之psutil详解

    一.psutil模块: 1.psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息 ...

  5. python模块学习第 0000 题

    将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果: 好可爱>%<! 题目来源:https://github.com/Yixiao ...

  6. Python模块学习:logging 日志记录

    原文出处: DarkBull    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...

  7. 解惑Python模块学习,该如何着手操作...

    Python模块 晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力.然后C.Java.Python-对于零基础入门的,当然是选择Python的人较多了.可朋友说他只是看了简单的语法,可pyth ...

  8. Python模块学习

    6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...

  9. Python模块学习系列

    python模块-time python模块-datetime python模块-OS模块详解

随机推荐

  1. C#下载网页

    System.Net.WebClient wc = new System.Net.WebClient(); Byte[] pageData = wc.DownloadData("网页地址&q ...

  2. Eclipse闪退解决方案

    1. 找到Eclipse目录下的eclipse.exe,右键点击->发送到桌面快捷方式,然后右键点击快捷方式,选择属性,修改“目标”(或target),其中红色代表eclipse的路径,绿色代表 ...

  3. BZOJ 1486 最小圈(01分数规划)

    好像是很normal的01分数规划题.最小比率生成环. u(c)=sigma(E)/k.转化一下就是k*u(c)=sigma(E). sigma(E-u(c))=0. 所以答案对于这个式子是有单调性的 ...

  4. 【bzoj1334】[Baltic2008]Elect 背包dp

    题目描述 N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党 ...

  5. Codeforces Round #510 Div. 2 Virtual Participate记

    这场打的顺手到不敢相信.如果不是vp的话估计肯定打不到这个成绩. A:最大显然,最小的话每次暴力给最小的+1. #include<iostream> #include<cstdio& ...

  6. CentOS 设置环境变量

    1. 查看环境变量,echo 命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]” echo $PATH /usr/local/bin:/usr/bin:/usr/lo ...

  7. BZOJ2816:[ZJOI2012]网络——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2816 https://www.luogu.org/problemnew/show/P2173 有一 ...

  8. python代码格式规范

    目前的规范基于pep-0008 基本格式 缩进 使用4个空格进行缩进 行宽 每行代码尽量不超过80个字符 理由: 这在查看side-by-side的diff时很有帮助 方便在控制台下查看代码 太长可能 ...

  9. SCU 4527 NightMare2 最短路+二分 好题

    可怜的又做噩梦了..但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着这些财宝并活着逃出去的话,他就发财啦.不过,这次 ...

  10. Codeforces Round #407 (Div. 2) D,E

    图论 D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard ...