关于python:​Python-常用库之-psutil-使用指南

52次阅读

共计 19148 个字符,预计需要花费 48 分钟才能阅读完成。

楔子
Python 有一个第三方模块:psutil,专门用来获取操作系统以及硬件相干的信息,比方:CPU、磁盘、网络、内存等等。

首先咱们要装置,间接 pip install psutil 即可,装置之后来看看它的用法。

CPU 相干
获取 CPU 的逻辑数量

import psutil
print(psutil.cpu_count())  # 12

获取 CPU 的物理外围数量

import psutil

print(psutil.cpu_count(logical=False))  # 6

后果为 6,阐明是 6 核超线程;如果 CPU 的物理外围数 和 逻辑数相等,也为 12,则阐明是 12 核非超线程。

统计 CPU 的用户/零碎/闲暇工夫

import psutil

print(psutil.cpu_times()) 
# scputimes(user=65531.796875, system=42440.76562500023, idle=1783904.3593749998, interrupt=5676.375, dpc=1846.609375)

# psutil.cpu_times_percent() 性能与之相似, 只不过返回的比例

返回的是一个 namedtuple,前面但凡构造长的和这里相似的,都是 namedtuple。

查看 CPU 的使用率

import psutil

for x in range(3):
    # interval:示意每隔 0.5s 刷新一次
    # percpu:示意查看所有的 cpu 使用率
    print(psutil.cpu_percent(interval=0.5, percpu=True))
"""
[6.1, 6.2, 9.4, 3.1, 0.0, 0.0, 0.0, 6.2, 3.1, 3.1, 3.1, 0.0]
[0.0, 0.0, 6.1, 0.0, 6.1, 3.0, 0.0, 3.0, 3.0, 3.0, 0.0, 9.1]
[0.0, 0.0, 6.2, 3.1, 3.1, 0.0, 3.1, 3.1, 3.1, 3.1, 0.0, 0.0]
"""
# 我这里 cpu 的逻辑数量是 12, 所以每个列表外面有 12 个元素

查看 CPU 的统计信息,包含上下文切换、中断、软中断,以及零碎调用次数等等

import psutil

print(psutil.cpu_stats())
# scpustats(ctx_switches=2912990332, interrupts=4290503758, soft_interrupts=0, syscalls=2698751096)

查看 CPU 的频率

import psutil

print(psutil.cpu_freq())  # scpufreq(current=2208.0, min=0.0, max=2208.0)

内存相干
查看内存应用状况

import psutil

print(psutil.virtual_memory())  
# svmem(total=17029259264, available=8437215232, percent=50.5, used=8592044032, free=8437215232)
  • total: 总内存
  • available: 可用内存
  • percent: 内存使用率
  • used: 已应用的内存

查看替换内存信息

import psutil

print(psutil.swap_memory())
# sswap(total=19579396096, used=15708250112, free=3871145984, percent=80.2, sin=0, sout=0)

对于物理内存和替换内存之间的关系。

物理内存:就是理论的内存条提供的长期数据存储空间,在 Windows 上右键点击计算机,再点击属性时,下面显示的装置内存(RAM)就是电脑的物理内存。这些内存是理论存在的,在你不给机器减少内存条的时候是不会扭转的。
替换内存:替换内存是专门用来长期存储数据的,通常在页面调度和替换过程数据时应用。相当于在进行内存整理的时候,会先把局部数据放在硬盘的某个中央,相似咱们整顿衣柜,衣服一多间接整顿会很麻烦,因而会先把局部衣服放在其余中央,等衣柜里的衣服整顿完了再把放在其它中央的衣服拿回来。这个其余中央放在计算机中则代表硬盘的某个中央,也就是咱们所说的替换区。通常当应用替换内存时,是因为物理内存不足,正所谓衣柜,如果足够大的话就没必要拿出局部衣服放在其它中央,间接在衣柜里就能解决了。
虚拟内存:首先,如果想要操作文件,可执行程序等等,那么首先要把它们从磁盘上读取到内存中,因而 CPU 除了本人的那一部分小小的空间外,要想操作数据,只能操作内存里的数据。然而当内存不够了,那么便会在硬盘上开拓一份虚拟内存,将物理内存里的局部数据放在虚拟内存当中。硬盘的空间很大,即便一般电脑装置的固态硬盘也有一百个 G,因而能够拿出一部分充当虚拟内存。不过虚拟内存虽说是内存,但毕竟在硬盘上,速度相对和 CPU 间接从物理内存里读取数据的速度相差甚远。这也是为什么那些大型网站将常常被拜访的一些数据放在 Redis 缓存里,而不是放在硬盘或者数据库上。

磁盘相干
查看磁盘分区、磁盘使用率和磁盘 IO 信息

from pprint import pprint
import psutil

pprint(psutil.disk_partitions())
"""[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'),
 sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'),
 sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed')]
"""
# 能够看到一共有三个盘符,fstype 示意文件系统格局是 NTFS,opts 中的 rw 示意可读写
# 外面有一个参数 all, 默认为 False, 如果指定为 True, 那么返回的内容还会蕴含 /proc 等非凡文件系统的挂载信息
# 因为我这里是 Windows, 所以两者没区别

查看某个磁盘应用状况

import psutil

print(psutil.disk_usage("C:\\"))
# sdiskusage(total=267117391872, used=88213196800, free=178904195072, percent=33.0)

查看磁盘 IO 统计信息

from pprint import pprint
import psutil

pprint(psutil.disk_io_counters())
# sdiskio(read_count=1270037, write_count=2146886, read_bytes=34637616128, write_bytes=53505994240, read_time=551, write_time=1258)
  • read_count: 读次数
  • write_count: 写次数
  • read_bytes: 读的字节数
  • write_bytes: 写的字节数
  • read_time: 读工夫
  • write_time: 写工夫

默认返回的是所有磁盘加起来的统计信息,咱们能够指定 perdisk=True,则别离列出每一个磁盘的统计信息。

from pprint import pprint
import psutil

pprint(psutil.disk_io_counters(perdisk=True))
"""{'PhysicalDrive0': sdiskio(read_count=1262459, write_count=2149207, read_bytes=34598280704, write_bytes=53708976128, read_time=532, write_time=1261),'PhysicalDrive1': sdiskio(read_count=7702, write_count=98, read_bytes=41695232, write_bytes=4730880, read_time=19, write_time=0)}"""

网络相干
查看网卡的网络 IO 统计信息

from pprint import pprint
import psutil

pprint(psutil.net_io_counters())
"""snetio(bytes_sent=536008958, bytes_recv=8676204996, packets_sent=2725499, packets_recv=7225179, errin=0, errout=9, dropin=0, dropout=0)"""
# bytes_sent: 发送的字节数
# bytes_recv: 接管的字节数
# packets_sent: 发送的包数据量
# packets_recv: 接管的包数据量
# errin: 接管包时, 出错的次数
# errout: 发送包时, 出错的次数
# dropin: 接管包时, 抛弃的次数
# dropout: 发送包时, 抛弃的次数


# 外面还有一个 pernic 参数, 如果为 True, 则列出所有网卡的信息
pprint(psutil.net_io_counters(pernic=True))
"""{'Loopback Pseudo-Interface 1': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),'WLAN': snetio(bytes_sent=534497477, bytes_recv=8678905297, packets_sent=2706204, packets_recv=7244187, errin=0, errout=0, dropin=0, dropout=0),' 以太网 ': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),' 以太网 2': snetio(bytes_sent=3612804, bytes_recv=7955853, packets_sent=32818, packets_recv=26442, errin=0, errout=9, dropin=0, dropout=0),' 本地连接 * 2': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),' 本地连接 * 3': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),' 蓝牙网络连接 ': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}"""

查看网络接口信息

from pprint import pprint
import psutil

# 以字典的模式返回网卡的配置信息, 包含 IP 地址、Mac 地址、子网掩码、播送地址等等
pprint(psutil.net_if_addrs())
"""{'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)],
 'WLAN': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-24', netmask=None, broadcast=None, ptp=None),
          snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.8.115', netmask='255.255.255.0', broadcast=None, ptp=None),
          snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fd94:e9ee:f230:6e00:55c9:8d1e:f23d:3acc', netmask=None, broadcast=None, ptp=None),
          snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fd94:e9ee:f230:6e00:dc07:1987:2395:d871', netmask=None, broadcast=None, ptp=None),
          snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::55c9:8d1e:f23d:3acc', netmask=None, broadcast=None, ptp=None)],
 '以太网': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='9C-7B-EF-15-FC-2F', netmask=None, broadcast=None, ptp=None),
         snicaddr(family=<AddressFamily.AF_INET: 2>, address='10.254.61.6', netmask='255.255.255.0', broadcast=None, ptp=None),
         snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.54.71', netmask='255.255.0.0', broadcast=None, ptp=None),
         snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::4826:a6a6:b5f4:3647', netmask=None, broadcast=None, ptp=None)],
 '以太网 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='00-FF-B3-BA-07-AE', netmask=None, broadcast=None, ptp=None),
           snicaddr(family=<AddressFamily.AF_INET: 2>, address='2.0.1.32', netmask='255.255.255.0', broadcast=None, ptp=None),
           snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::cc21:26c6:9327:1355', netmask=None, broadcast=None, ptp=None)],
 '本地连接 * 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-25', netmask=None, broadcast=None, ptp=None),
             snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.45.234', netmask='255.255.0.0', broadcast=None, ptp=None),
             snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::d958:b3fe:ef3d:2dea', netmask=None, broadcast=None, ptp=None)],
 '本地连接 * 3': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='06-EA-56-8C-36-24', netmask=None, broadcast=None, ptp=None),
             snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.41.166', netmask='255.255.0.0', broadcast=None, ptp=None),
             snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::6474:c583:1626:29a6', netmask=None, broadcast=None, ptp=None)],
 '蓝牙网络连接': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-28', netmask=None, broadcast=None, ptp=None),
            snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.135.205', netmask='255.255.0.0', broadcast=None, ptp=None),
            snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::5cbd:8913:7499:87cd', netmask=None, broadcast=None, ptp=None)]}

"""

# 返回网卡的详细信息, 包含是否启动、通信类型、传输速度、mtu
pprint(psutil.net_if_stats())
"""{'Loopback Pseudo-Interface 1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1073, mtu=1500),'WLAN': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=866, mtu=1500),' 以太网 ': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),' 以太网 2': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=10, mtu=1400),' 本地连接 * 2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),' 本地连接 * 3': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),' 蓝牙网络连接 ': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=3, mtu=1500)}"""

查看以后机器的网络连接

from pprint import pprint
import psutil

# 以列表的模式返回每个网络连接的详细信息
# 外面承受一个参数, 默认是 "inet", 当然咱们也能够指定为其它, 比方 "tcp"
pprint(psutil.net_connections())
"""[sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=1024), raddr=(), status='LISTEN', pid=940),
 sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=5432), raddr=(), status='LISTEN', pid=7620),
 sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=10637), raddr=addr(ip='127.0.0.1', port=10638), status='ESTABLISHED', pid=10152),
 sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=10613), raddr=addr(ip='127.0.0.1', port=10612), status='ESTABLISHED', pid=10152),
 sconn(fd=-1, family=<AddressFamily.AF_INET6: 23>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='::', port=5353), raddr=(), status='NONE', pid=8820),
 sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=54541), raddr=(), status='LISTEN', pid=2908),
 sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, 
 ....
 ....
 ....
]
"""

# 是不是很不便呢? 在 Linux 中有两个命令能够做到这一点, netstat 和 ss
# $ netstat -nat
# $ ss -nat

# 然而在生产环境中, 线上服务器很多都是最小化装置, 并不能保障每台机器上都有 ss 或者 netstat 命令, 而这个时候 psutil 就派上用场了

查看以后登录的用户信息

from pprint import pprint
import psutil

pprint(psutil.users())  
# [suser(name='satori', terminal=None, host='0.0.0.0', started=1609841661.0, pid=None)]
  1. name: 用户名
  2. terminal: 终端
  3. host: 主机地址
  4. started: 登录工夫
  5. pid: 过程 id

查看零碎的启动工夫

from pprint import pprint
import psutil
import datetime

pprint(psutil.boot_time())  # 1585282271.0
print(datetime.datetime.fromtimestamp(psutil.boot_time()))  # 2020-03-27 12:11:11

过程治理
psutil 还提供了很多和过程治理相干的性能函数,十分的丰盛,咱们来看一下。

查看以后存在的所有过程的 pid

from pprint import pprint
import psutil

pprint(psutil.pids())
"""
[0,
 4,
 144,
 512,
 536,
 632,
 640,
 664,
 696,
 768,
 776,
 ...
 ...
 ...
]
"""

查看某个过程是否存在


from pprint import pprint
import psutil

pprint(psutil.pid_exists(22333))  # False
pprint(psutil.pid_exists(0))  # True

返回所有过程(Process)对象组成的迭代器

from pprint import pprint
import psutil

pprint(psutil.process_iter())  # <generator object process_iter at 0x000001F12032C9E0>

依据 pid 获取一个过程对应的 Process 对象

from pprint import pprint
import psutil

pprint(psutil.Process(pid=0))  # psutil.Process(pid=0, name='System Idle Process', started='2020-2-27 09:07:47')

获取过程相干的具体信息
咱们说依据 pid 能够获取一个过程对应的 Process 对象,而这个对象外面蕴含了该过程的全副信息。

 from pprint import pprint
import psutil

p = psutil.Process(pid=16948)

# 过程名称
print(p.name()) # WeChat.exe

# 过程的 exe 门路
print(p.exe()) # D:\WeChat\WeChat.exe

# 过程的工作目录
print(p.cwd()) # D:\WeChat

# 过程启动的命令行
print(p.cmdline()) # ['D:\\WeChat\\WeChat.exe']

# 以后过程 id
print(p.pid) # 16948

# 父过程 id
print(p.ppid()) # 11700

# 父过程
print(p.parent()) # psutil.Process(pid=11700, name='explorer.exe', started='09:19:06')

# 子过程列表
pprint(p.children())
"""[psutil.Process(pid=17452, name='WeChatWeb.exe', started='09:21:02'), 
 psutil.Process(pid=16216, name='WeChatApp.exe', started='09:21:40'), 
 psutil.Process(pid=13452, name='SogouCloud.exe', started='09:22:14')]
"""

# 过程状态
print(p.status()) # running

# 过程用户名
print(p.username()) # LAPTOP-264ORES3\satori

# 过程创立工夫, 返回工夫戳
print(p.create_time()) # 1561775539.0

# 过程终端
# 在 windows 上无奈应用
try:
    print(p.terminal())
except Exception as e:
    print(e) # 'Process' object has no attribute 'terminal'

# 过程应用的 cpu 工夫
print(p.cpu_times())  # pcputimes(user=133.3125, system=188.203125, children_user=0.0, children_system=0.0)

# 过程所应用的的内存
print(p.memory_info())
"""
pmem(rss=128634880, vms=117067776, num_page_faults=12193918, 
     peak_wset=263921664, wset=128634880, peak_paged_pool=1398584, 
     paged_pool=1329936, peak_nonpaged_pool=313896, nonpaged_pool=152192, 
     pagefile=117067776, peak_pagefile=201670656, private=117067776)
"""

# 过程关上的文件
pprint(p.open_files())
"""[popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Media.db-wal', fd=-1),
 popenfile(path='C:\\Users\\satori\\AppData\\Roaming\\Tencent\\WeChat\\All Users\\CefResources\\2581\\qb_200_percent.pak', fd=-1),
 popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Multi\\MSG0.db-shm', fd=-1),
 popenfile(path='C:\\Program Files\\WindowsApps\\Microsoft.LanguageExperiencePackzh-CN_18362.28.87.0_neutral__8wekyb3d8bbwe\\Windows\\System32\\zh-CN\\dui70.dll.mui', fd=-1),
 popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Multi\\MediaMSG2.db-shm', fd=-1),
 popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Emotion.db-wal', fd=-1),
 popenfile(path='C:\\Windows\\Fonts\\msyh.ttc', fd=-1),
 ......
 ......
 ......
 ]
"""

# 过程相干的网络连接
pprint(p.connections())
"""[pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.8.115', port=5162), raddr=addr(ip='183.3.234.107', port=443), status='ESTABLISHED'),
 pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.8.115', port=13856), raddr=addr(ip='61.151.168.204', port=80), status='CLOSE_WAIT'),
 pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=8680), raddr=(), status='LISTEN')]
"""

# 过程内的线程数量,这个过程开启了多少个线程
print(p.num_threads())  # 66

# 这个过程内的所有线程信息
pprint(p.threads())
"""
[pthread(id=13340, user_time=113.328125, system_time=179.015625),
 pthread(id=17120, user_time=0.0, system_time=0.0625),
 pthread(id=7216, user_time=0.15625, system_time=0.515625),
 pthread(id=13360, user_time=0.703125, system_time=0.21875),
 pthread(id=10684, user_time=0.015625, system_time=0.078125),
 pthread(id=13552, user_time=2.9375, system_time=0.171875),
 pthread(id=12620, user_time=0.265625, system_time=0.296875),
 pthread(id=14492, user_time=0.015625, system_time=0.03125),
 pthread(id=14568, user_time=0.0, system_time=0.046875),
 pthread(id=17112, user_time=0.015625, system_time=0.0625),
 pthread(id=9344, user_time=0.0, system_time=0.015625),
 pthread(id=13544, user_time=0.0, system_time=0.0),
 pthread(id=10028, user_time=0.078125, system_time=0.125),
 pthread(id=4920, user_time=0.015625, system_time=0.0625),
 pthread(id=5744, user_time=0.0, system_time=0.015625),
 pthread(id=7044, user_time=0.0, system_time=0.0),
 pthread(id=14064, user_time=0.0, system_time=0.0),
 pthread(id=11916, user_time=0.0, system_time=0.0),
 pthread(id=1316, user_time=0.0, system_time=0.0),
 pthread(id=18100, user_time=0.0, system_time=0.0),
 pthread(id=2992, user_time=0.0, system_time=0.0),
 pthread(id=8956, user_time=0.0, system_time=0.0),
 pthread(id=8588, user_time=0.03125, system_time=0.03125),
 pthread(id=3944, user_time=0.0, system_time=0.03125),
 pthread(id=15828, user_time=0.0, system_time=0.015625),
 pthread(id=7348, user_time=0.0, system_time=0.03125),
 pthread(id=3400, user_time=0.0, system_time=0.015625),
 pthread(id=8628, user_time=0.0, system_time=0.0),
 pthread(id=2400, user_time=0.0, system_time=0.0),
 pthread(id=9432, user_time=1.28125, system_time=0.171875),
 pthread(id=11544, user_time=0.0, system_time=0.015625),
 pthread(id=12348, user_time=2.96875, system_time=3.78125),
 pthread(id=3444, user_time=0.0, system_time=0.0),
 pthread(id=17476, user_time=0.0, system_time=0.0),
 pthread(id=15856, user_time=0.0, system_time=0.015625),
 pthread(id=12248, user_time=0.0, system_time=0.0),
 pthread(id=17280, user_time=0.0, system_time=0.0),
 ......
 ......
 ......
 ]
"""

# 过程的环境变量
pprint(p.environ())
"""{'ALLUSERSPROFILE':'C:\\ProgramData','APPDATA':'C:\\Users\\satori\\AppData\\Roaming','COMMONPROGRAMFILES':'C:\\Program Files (x86)\\Common Files','COMMONPROGRAMFILES(X86)':'C:\\Program Files (x86)\\Common Files','COMMONPROGRAMW6432':'C:\\Program Files\\Common Files','COMPUTERNAME':'LAPTOP-264ORES3','COMSPEC':'C:\\WINDOWS\\system32\\cmd.exe','DRIVERDATA':'C:\\Windows\\System32\\Drivers\\DriverData','GOPATH':'C:\\Users\\satori\\go','HOMEDRIVE':'C:','HOMEPATH':'\\Users\\satori','LOCALAPPDATA':'C:\\Users\\satori\\AppData\\Local','LOGONSERVER':'\\\\LAPTOP-264ORES3','NUMBER_OF_PROCESSORS':'12','ONEDRIVE':'C:\\Users\\satori\\OneDrive','ONEDRIVECONSUMER':'C:\\Users\\satori\\OneDrive','ONLINESERVICES':'Online Services','OS':'Windows_NT','PATH':'C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine ''Components\\iCLS\\;C:\\Program Files\\Intel\\Intel(R) Management'
         'Engine'
         'Components\\iCLS\\;C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C:\\windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\windows\\System32\\OpenSSH\\;C:\\Program'
         'Files (x86)\\Intel\\Intel(R) Management Engine'
         'Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine'
         'Components\\DAL;C:\\Program Files (x86)\\NVIDIA'
         'Corporation\\PhysX\\Common;C:\\Program'
         'Files\\Intel\\WiFi\\bin\\;C:\\Program Files\\Common'
         'Files\\Intel\\WirelessCommon\\;C:\\python37;c:\\python37\\Scripts;C:\\Program'
         'Files\\Git\\cmd;E:\\instantclient_10_2;C:\\Program'
         'Files\\Redis\\;D:\\ffmpeg\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Go\\bin;C:\\MingW\\bin;C:\\Users\\satori\\.cargo\\bin;C:\\python37\\Scripts\\;C:\\python37\\;C:\\python38\\Scripts\\;C:\\python38\\;C:\\Users\\satori\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\satori\\go\\bin',
 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
 'PLATFORMCODE': 'AN',
 'PROCESSOR_ARCHITECTURE': 'x86',
 'PROCESSOR_ARCHITEW6432': 'AMD64',
 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 158 Stepping 10, GenuineIntel',
 'PROCESSOR_LEVEL': '6',
 'PROCESSOR_REVISION': '9e0a',
 'PROGRAMDATA': 'C:\\ProgramData',
 'PROGRAMFILES': 'C:\\Program Files (x86)',
 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)',
 'PROGRAMW6432': 'C:\\Program Files',
 'PSMODULEPATH': 'C:\\Program'
                 'Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules',
 'PUBLIC': 'C:\\Users\\Public',
 'REGIONCODE': 'APJ',
 'SESSIONNAME': 'Console',
 'SYSTEMDRIVE': 'C:',
 'SYSTEMROOT': 'C:\\WINDOWS',
 'TBS_CONTENT_MAIN_RUNNER_INITIALIZED': '1',
 'TEMP': 'C:\\Users\\satori\\AppData\\Local\\Temp',
 'TMP': 'C:\\Users\\satori\\AppData\\Local\\Temp',
 'USERDOMAIN': 'LAPTOP-264ORES3',
 'USERDOMAIN_ROAMINGPROFILE': 'LAPTOP-264ORES3',
 'USERNAME': 'satori',
 'USERPROFILE': 'C:\\Users\\satori',
 'VS140COMNTOOLS': 'C:\\Program Files (x86)\\Microsoft Visual Studio'
                   '14.0\\Common7\\Tools\\',
 'WINDIR': 'C:\\WINDOWS',
 'WXDRIVE_START_ARGS': '--wxdrive-setting=0 --disable-gpu'
                       '--disable-software-rasterizer'
                       '--enable-features=NetworkServiceInProcess'}
"""

# 完结过程, 返回 None, 执行之后微信就会被强制敞开, 当然这里就不试了
# print(p.terminal())  # None

咱们还能够调用 psutil.test 来模仿 ps 命令。

import psutil

psutil.test()
"""
USER         PID  %MEM     VSZ     RSS  NICE STATUS  START   TIME  CMDLINE
SYSTEM         0   0.0   60.0K    8.0K        runni  Dec30  00:39  System Idle P
SYSTEM         4   0.0  236.0K    1.4M        runni  Dec30  14:32  System
             144   0.2    8.1M   32.2M        runni  Dec30  00:03  Registry
             512   0.0    1.1M  304.0K        runni  Dec30  00:00  smss.exe
             536   0.0  912.0K    1.0M        runni  Dec30  00:00  svchost.exe
             632   0.1   13.0M   15.0M        runni  Dec30  00:29  svchost.exe
             640   0.0    2.1M    1.3M        runni  Dec30  00:00  fontdrvhost.e
satori       664   0.1   26.1M   17.1M    32  runni  09:19  00:02  C:\WINDOWS\Sy
             696   0.0    6.7M    3.8M        runni  Dec30  00:04  WUDFHost.exe
             768   0.0    1.9M    1.9M        runni  Dec30  00:26  csrss.exe
......................
......................
......................
......................
......................
"""

它是怎么做的呢?还记得咱们之前说的 process_iter 吗?会返回所有过程的 Process 对象,间接顺次输入外面的信息即可。同理,咱们也能够通过 process_iter 找到某一个过程对应的过程 id。

import psutil

for prcs in psutil.process_iter():
    if prcs.name().lower() == "wechat.exe":
        print(prcs.pid)
"""16948"""

# 有了这个骚操作之后,咱们便能够通过过程 id 找到对应的过程
# 而后批改外面的数据

小结
总的来说,这个库是十分弱小的,很好用,能够获取很多底层的信息。

最近整顿了几百 G 的 Python 学习材料,蕴含电子书、教程、视频等等,收费分享给大家!想要的返回 薇❤工号“Python 编程学习圈”,发送“J”即可收费取得泛滥 python 干货与材料,让你轻松搞定 python

正文完
 0