博客列表 >ython 常用库之 psutil 使用指南

ython 常用库之 psutil 使用指南

P粉379686903
P粉379686903原创
2022年07月11日 16:32:07651浏览

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

首先我们要安装,直接 pip install psutil 即可,安装之后来看看它的用法。

CPU 相关
获取 CPU 的逻辑数量

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

获取 CPU 的物理核心数量

  1. import psutil
  2. print(psutil.cpu_count(logical=False)) # 6

结果为 6,说明是 6 核超线程;如果 CPU 的物理核心数 和 逻辑数相等,也为 12,则说明是 12 核非超线程。
统计 CPU 的用户/系统/空闲时间

  1. import psutil
  2. print(psutil.cpu_times())
  3. # scputimes(user=65531.796875, system=42440.76562500023, idle=1783904.3593749998, interrupt=5676.375, dpc=1846.609375)
  4. # psutil.cpu_times_percent() 功能与之类似, 只不过返回的比例

返回的是一个 namedtuple,后面凡是结构长的和这里类似的,都是 namedtuple。

查看 CPU 的使用率

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

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

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

查看 CPU 的频率

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

内存相关
查看内存使用情况

  1. import psutil
  2. print(psutil.virtual_memory())
  3. # svmem(total=17029259264, available=8437215232, percent=50.5, used=8592044032, free=8437215232)

total: 总内存
available: 可用内存
percent: 内存使用率
used: 已使用的内存
查看交换内存信息

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

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

物理内存:就是实际的内存条提供的临时数据存储空间,在 Windows 上右键点击计算机,再点击属性时,上面显示的安装内存(RAM)就是电脑的物理内存。这些内存是实际存在的,在你不给机器增加内存条的时候是不会改变的。
交换内存:交换内存是专门用来临时存储数据的,通常在页面调度和交换进程数据时使用。相当于在进行内存整理的时候,会先把部分数据放在硬盘的某个地方,类似我们整理衣柜,衣服一多直接整理会很麻烦,因此会先把部分衣服放在其他地方,等衣柜里的衣服整理完了再把放在其它地方的衣服拿回来。这个其他地方放在计算机中则代表硬盘的某个地方,也就是我们所说的交换区。通常当使用交换内存时,是因为物理内存不足,正所谓衣柜,如果足够大的话就没必要拿出部分衣服放在其它地方, 直接在衣柜里就能解决了。
虚拟内存:首先,如果想要操作文件,可执行程序等等,那么首先要把它们从磁盘上读取到内存中,因此 CPU 除了自己的那一部分小小的空间外,要想操作数据,只能操作内存里的数据。但是当内存不够了,那么便会在硬盘上开辟一份虚拟内存,将物理内存里的部分数据放在虚拟内存当中。硬盘的空间很大,即使普通电脑安装的固态硬盘也有一百个 G,因此可以拿出一部分充当虚拟内存。不过虚拟内存虽说是内存,但毕竟在硬盘上,速度绝对和 CPU 直接从物理内存里读取数据的速度相差甚远。这也是为什么那些大型网站将经常被访问的一些数据放在 Redis 缓存里,而不是放在硬盘或者数据库上。
磁盘相关
查看磁盘分区、磁盘使用率和磁盘 IO 信息

  1. from pprint import pprint
  2. import psutil
  3. pprint(psutil.disk_partitions())
  4. """
  5. [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'),
  6. sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'),
  7. sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed')]
  8. """
  9. # 可以看到一共有三个盘符,fstype表示文件系统格式是NTFSopts中的rw表示可读写
  10. # 里面有一个参数 all, 默认为 False, 如果指定为 True, 那么返回的内容还会包含 /proc 等特殊文件系统的挂载信息
  11. # 由于我这里是 Windows, 所以两者没区别

查看某个磁盘使用情况

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

查看磁盘 IO 统计信息

  1. from pprint import pprint
  2. import psutil
  3. pprint(psutil.disk_io_counters())
  4. # 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,则分别列出每一个磁盘的统计信息。

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

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

  1. from pprint import pprint
  2. import psutil
  3. pprint(psutil.net_io_counters())
  4. """
  5. snetio(bytes_sent=536008958, bytes_recv=8676204996, packets_sent=2725499, packets_recv=7225179, errin=0, errout=9, dropin=0, dropout=0)
  6. """
  7. # bytes_sent: 发送的字节数
  8. # bytes_recv: 接收的字节数
  9. # packets_sent: 发送的包数据量
  10. # packets_recv: 接收的包数据量
  11. # errin: 接收包时, 出错的次数
  12. # errout: 发送包时, 出错的次数
  13. # dropin: 接收包时, 丢弃的次数
  14. # dropout: 发送包时, 丢弃的次数
  15. # 里面还有一个 pernic 参数, 如果为 True, 则列出所有网卡的信息
  16. pprint(psutil.net_io_counters(pernic=True))
  17. """
  18. {'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),
  19. 'WLAN': snetio(bytes_sent=534497477, bytes_recv=8678905297, packets_sent=2706204, packets_recv=7244187, errin=0, errout=0, dropin=0, dropout=0),
  20. '以太网': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
  21. '以太网 2': snetio(bytes_sent=3612804, bytes_recv=7955853, packets_sent=32818, packets_recv=26442, errin=0, errout=9, dropin=0, dropout=0),
  22. '本地连接* 2': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
  23. '本地连接* 3': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
  24. '蓝牙网络连接': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}
  25. """

查看网络接口信息

  1. snicaddr(family=<AddressFamily.AF_INET: 2>, address='2.0.1.32', netmask='255.255.255.0', broadcast=None, ptp=None),
  2. snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::cc21:26c6:9327:1355', netmask=None, broadcast=None, ptp=None)],
  3. '本地连接* 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-25', netmask=None, broadcast=None, ptp=None),
  4. snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.45.234', netmask='255.255.0.0', broadcast=None, ptp=None),
  5. snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::d958:b3fe:ef3d:2dea', netmask=None, broadcast=None, ptp=None)],
  6. '本地连接* 3': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='06-EA-56-8C-36-24', netmask=None, broadcast=None, ptp=None),
  7. snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.41.166', netmask='255.255.0.0', broadcast=None, ptp=None),
  8. snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::6474:c583:1626:29a6', netmask=None, broadcast=None, ptp=None)],
  9. '蓝牙网络连接': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='04-EA-56-8C-36-28', netmask=None, broadcast=None, ptp=None),
  10. snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.135.205', netmask='255.255.0.0', broadcast=None, ptp=None),
  11. snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::5cbd:8913:7499:87cd', netmask=None, broadcast=None, ptp=None)]}
  12. """
  13. # 返回网卡的详细信息, 包括是否启动、通信类型、传输速度、mtu
  14. pprint(psutil.net_if_stats())
  15. """
  16. {'Loopback Pseudo-Interface 1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1073, mtu=1500),
  17. 'WLAN': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=866, mtu=1500),
  18. '以太网': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
  19. '以太网 2': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=10, mtu=1400),
  20. '本地连接* 2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
  21. '本地连接* 3': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
  22. '蓝牙网络连接': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=3, mtu=1500)}
  23. """

查看当前机器的网络连接

  1. from pprint import pprint
  2. import psutil
  3. # 以列表的形式返回每个网络连接的详细信息
  4. # 里面接受一个参数, 默认是 "inet", 当然我们也可以指定为其它, 比如 "tcp"
  5. pprint(psutil.net_connections())
  6. """
  7. [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),
  8. 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),
  9. 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),
  10. 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),
  11. sconn(fd=-1, family=<AddressFamily.AF_INET6: 23>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='::', port=5353), raddr=(), status='NONE', pid=8820),
  12. 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),
  13. sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>,
  14. ....
  15. ....
  16. ....
  17. ]
  18. """
  19. # 是不是很方便呢? Linux 中有两个命令可以做到这一点, netstat ss
  20. # $ netstat -nat
  21. # $ ss -nat
  22. # 但是在生产环境中, 线上服务器很多都是最小化安装, 并不能保证每台机器上都有 ss 或者 netstat 命令, 而这个时候 psutil 就派上用场了

查看当前登录的用户信息

  1. from pprint import pprint
  2. import psutil
  3. pprint(psutil.users())
  4. # [suser(name='satori', terminal=None, host='0.0.0.0', started=1609841661.0, pid=None)]

1:name: 用户名:
2:terminal: 终端
3:host: 主机地址:4
4:started: 登录时间
5:pid: 进程id
查看系统的启动时间

  1. from pprint import pprint
  2. import psutil
  3. import datetime
  4. pprint(psutil.boot_time()) # 1585282271.0
  5. print(datetime.datetime.fromtimestamp(psutil.boot_time())) # 2020-03-27 12:11:11

进程管理
psutil 还提供了很多和进程管理相关的功能函数,非常的丰富,我们来看一下。

查看当前存在的所有进程的 pid

  1. from pprint import pprint
  2. import psutil
  3. pprint(psutil.pids())
  4. """
  5. [0,
  6. 4,
  7. 144,
  8. 512,
  9. 536,
  10. 632,
  11. 640,
  12. 664,
  13. 696,
  14. 768,
  15. 776,
  16. ...
  17. ...
  18. ...
  19. ]
  20. """

查看某个进程是否存在

  1. from pprint import pprint
  2. import psutil
  3. pprint(psutil.pid_exists(22333)) # False
  4. pprint(psutil.pid_exists(0)) # True

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

  1. from pprint import pprint
  2. import psutil
  3. pprint(psutil.process_iter()) # <generator object process_iter at 0x000001F12032C9E0>

根据 pid 获取一个进程对应的 Process 对象

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

获取进程相关的具体信息
我们说根据 pid 可以获取一个进程对应的 Process 对象,而这个对象里面包含了该进程的全部信息。

  1. from pprint import pprint
  2. import psutil
  3. p = psutil.Process(pid=16948)
  4. # 进程名称
  5. print(p.name()) # WeChat.exe
  6. # 进程的exe路径
  7. print(p.exe()) # D:\WeChat\WeChat.exe
  8. # 进程的工作目录
  9. print(p.cwd()) # D:\WeChat
  10. # 进程启动的命令行
  11. print(p.cmdline()) # ['D:\\WeChat\\WeChat.exe']
  12. # 当前进程id
  13. print(p.pid) # 16948
  14. # 父进程id
  15. print(p.ppid()) # 11700
  16. # 父进程
  17. print(p.parent()) # psutil.Process(pid=11700, name='explorer.exe', started='09:19:06')
  18. # 子进程列表
  19. pprint(p.children())
  20. """
  21. [psutil.Process(pid=17452, name='WeChatWeb.exe', started='09:21:02'),
  22. psutil.Process(pid=16216, name='WeChatApp.exe', started='09:21:40'),
  23. psutil.Process(pid=13452, name='SogouCloud.exe', started='09:22:14')]
  24. """
  25. # 进程状态
  26. print(p.status()) # running
  27. # 进程用户名
  28. print(p.username()) # LAPTOP-264ORES3\satori
  29. # 进程创建时间,返回时间戳
  30. print(p.create_time()) # 1561775539.0
  31. # 进程终端
  32. # windows上无法使用
  33. try:
  34. print(p.terminal())
  35. except Exception as e:
  36. print(e) # 'Process' object has no attribute 'terminal'
  37. # 进程使用的cpu时间
  38. print(p.cpu_times()) # pcputimes(user=133.3125, system=188.203125, children_user=0.0, children_system=0.0)
  39. # 进程所使用的的内存
  40. print(p.memory_info())
  41. """
  42. pmem(rss=128634880, vms=117067776, num_page_faults=12193918,
  43. peak_wset=263921664, wset=128634880, peak_paged_pool=1398584,
  44. paged_pool=1329936, peak_nonpaged_pool=313896, nonpaged_pool=152192,
  45. pagefile=117067776, peak_pagefile=201670656, private=117067776)
  46. """
  47. # 进程打开的文件
  48. pprint(p.open_files())
  49. """
  50. [popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Media.db-wal', fd=-1),
  51. popenfile(path='C:\\Users\\satori\\AppData\\Roaming\\Tencent\\WeChat\\All Users\\CefResources\\2581\\qb_200_percent.pak', fd=-1),
  52. popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Multi\\MSG0.db-shm', fd=-1),
  53. popenfile(path='C:\\Program Files\\WindowsApps\\Microsoft.LanguageExperiencePackzh-CN_18362.28.87.0_neutral__8wekyb3d8bbwe\\Windows\\System32\\zh-CN\\dui70.dll.mui', fd=-1),
  54. popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Multi\\MediaMSG2.db-shm', fd=-1),
  55. popenfile(path='C:\\Users\\satori\\Documents\\WeChat Files\\wxid_3ksrps1o47mf22\\Msg\\Emotion.db-wal', fd=-1),
  56. popenfile(path='C:\\Windows\\Fonts\\msyh.ttc', fd=-1),
  57. ......
  58. ......
  59. ......
  60. ]
  61. """
  62. # 进程相关的网络连接
  63. pprint(p.connections())
  64. """
  65. [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'),
  66. 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'),
  67. 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')]
  68. """
  69. # 进程内的线程数量,这个进程开启了多少个线程
  70. print(p.num_threads()) # 66
  71. # 这个进程内的所有线程信息
  72. pprint(p.threads())
  73. """
  74. [pthread(id=13340, user_time=113.328125, system_time=179.015625),
  75. pthread(id=17120, user_time=0.0, system_time=0.0625),
  76. pthread(id=7216, user_time=0.15625, system_time=0.515625),
  77. pthread(id=13360, user_time=0.703125, system_time=0.21875),
  78. pthread(id=10684, user_time=0.015625, system_time=0.078125),
  79. pthread(id=13552, user_time=2.9375, system_time=0.171875),
  80. pthread(id=12620, user_time=0.265625, system_time=0.296875),
  81. pthread(id=14492, user_time=0.015625, system_time=0.03125),
  82. pthread(id=14568, user_time=0.0, system_time=0.046875),
  83. pthread(id=17112, user_time=0.015625, system_time=0.0625),
  84. pthread(id=9344, user_time=0.0, system_time=0.015625),
  85. pthread(id=13544, user_time=0.0, system_time=0.0),
  86. pthread(id=10028, user_time=0.078125, system_time=0.125),
  87. pthread(id=4920, user_time=0.015625, system_time=0.0625),
  88. pthread(id=5744, user_time=0.0, system_time=0.015625),
  89. pthread(id=7044, user_time=0.0, system_time=0.0),
  90. pthread(id=14064, user_time=0.0, system_time=0.0),
  91. pthread(id=11916, user_time=0.0, system_time=0.0),
  92. pthread(id=1316, user_time=0.0, system_time=0.0),
  93. pthread(id=18100, user_time=0.0, system_time=0.0),
  94. pthread(id=2992, user_time=0.0, system_time=0.0),
  95. pthread(id=8956, user_time=0.0, system_time=0.0),
  96. pthread(id=8588, user_time=0.03125, system_time=0.03125),
  97. pthread(id=3944, user_time=0.0, system_time=0.03125),
  98. pthread(id=15828, user_time=0.0, system_time=0.015625),
  99. pthread(id=7348, user_time=0.0, system_time=0.03125),
  100. pthread(id=3400, user_time=0.0, system_time=0.015625),
  101. pthread(id=8628, user_time=0.0, system_time=0.0),
  102. pthread(id=2400, user_time=0.0, system_time=0.0),
  103. pthread(id=9432, user_time=1.28125, system_time=0.171875),
  104. pthread(id=11544, user_time=0.0, system_time=0.015625),
  105. pthread(id=12348, user_time=2.96875, system_time=3.78125),
  106. pthread(id=3444, user_time=0.0, system_time=0.0),
  107. pthread(id=17476, user_time=0.0, system_time=0.0),
  108. pthread(id=15856, user_time=0.0, system_time=0.015625),
  109. pthread(id=12248, user_time=0.0, system_time=0.0),
  110. pthread(id=17280, user_time=0.0, system_time=0.0),
  111. ......
  112. ......
  113. ......
  114. ]
  115. """
  116. # 进程的环境变量
  117. pprint(p.environ())
  118. """
  119. {'ALLUSERSPROFILE': 'C:\\ProgramData',
  120. 'APPDATA': 'C:\\Users\\satori\\AppData\\Roaming',
  121. 'COMMONPROGRAMFILES': 'C:\\Program Files (x86)\\Common Files',
  122. 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',
  123. 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',
  124. 'COMPUTERNAME': 'LAPTOP-264ORES3',
  125. 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',
  126. 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',
  127. 'GOPATH': 'C:\\Users\\satori\\go',
  128. 'HOMEDRIVE': 'C:',
  129. 'HOMEPATH': '\\Users\\satori',
  130. 'LOCALAPPDATA': 'C:\\Users\\satori\\AppData\\Local',
  131. 'LOGONSERVER': '\\\\LAPTOP-264ORES3',
  132. 'NUMBER_OF_PROCESSORS': '12',
  133. 'ONEDRIVE': 'C:\\Users\\satori\\OneDrive',
  134. 'ONEDRIVECONSUMER': 'C:\\Users\\satori\\OneDrive',
  135. 'ONLINESERVICES': 'Online Services',
  136. 'OS': 'Windows_NT',
  137. 'PATH': 'C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine '
  138. 'Components\\iCLS\\;C:\\Program Files\\Intel\\Intel(R) Management '
  139. 'Engine '
  140. 'Components\\iCLS\\;C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C:\\windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\windows\\System32\\OpenSSH\\;C:\\Program '
  141. 'Files (x86)\\Intel\\Intel(R) Management Engine '
  142. 'Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine '
  143. 'Components\\DAL;C:\\Program Files (x86)\\NVIDIA '
  144. 'Corporation\\PhysX\\Common;C:\\Program '
  145. 'Files\\Intel\\WiFi\\bin\\;C:\\Program Files\\Common '
  146. 'Files\\Intel\\WirelessCommon\\;C:\\python37;c:\\python37\\Scripts;C:\\Program '
  147. 'Files\\Git\\cmd;E:\\instantclient_10_2;C:\\Program '
  148. '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',
  149. 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
  150. 'PLATFORMCODE': 'AN',
  151. 'PROCESSOR_ARCHITECTURE': 'x86',
  152. 'PROCESSOR_ARCHITEW6432': 'AMD64',
  153. 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 158 Stepping 10, GenuineIntel',
  154. 'PROCESSOR_LEVEL': '6',
  155. 'PROCESSOR_REVISION': '9e0a',
  156. 'PROGRAMDATA': 'C:\\ProgramData',
  157. 'PROGRAMFILES': 'C:\\Program Files (x86)',
  158. 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)',
  159. 'PROGRAMW6432': 'C:\\Program Files',
  160. 'PSMODULEPATH': 'C:\\Program '
  161. 'Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules',
  162. 'PUBLIC': 'C:\\Users\\Public',
  163. 'REGIONCODE': 'APJ',
  164. 'SESSIONNAME': 'Console',
  165. 'SYSTEMDRIVE': 'C:',
  166. 'SYSTEMROOT': 'C:\\WINDOWS',
  167. 'TBS_CONTENT_MAIN_RUNNER_INITIALIZED': '1',
  168. 'TEMP': 'C:\\Users\\satori\\AppData\\Local\\Temp',
  169. 'TMP': 'C:\\Users\\satori\\AppData\\Local\\Temp',
  170. 'USERDOMAIN': 'LAPTOP-264ORES3',
  171. 'USERDOMAIN_ROAMINGPROFILE': 'LAPTOP-264ORES3',
  172. 'USERNAME': 'satori',
  173. 'USERPROFILE': 'C:\\Users\\satori',
  174. 'VS140COMNTOOLS': 'C:\\Program Files (x86)\\Microsoft Visual Studio '
  175. '14.0\\Common7\\Tools\\',
  176. 'WINDIR': 'C:\\WINDOWS',
  177. 'WXDRIVE_START_ARGS': '--wxdrive-setting=0 --disable-gpu '
  178. '--disable-software-rasterizer '
  179. '--enable-features=NetworkServiceInProcess'}
  180. """
  181. # 结束进程, 返回 None, 执行之后微信就会被强制关闭, 当然这里就不试了
  182. # print(p.terminal()) # None

我们还可以调用 psutil.test 来模拟 ps 命令。

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

它是怎么做的呢?还记得我们之前说的 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学习资料,包含电子书、教程、视频等等,免费分享给大家!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议