<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?Python常用庫(kù)之psutil使用指南

          共 30873字,需瀏覽 62分鐘

           ·

          2021-05-29 21:59

          作者:古明地盆

          來(lái)源:www.cnblogs.com/traditional/p/12580638.html

          大家好,歡迎來(lái)到 Crossin的編程教室 !

          Python 有一個(gè)第三方模塊:psutil,專門用來(lái)獲取操作系統(tǒng)以及硬件相關(guān)的信息,比如:CPU、磁盤、網(wǎng)絡(luò)、內(nèi)存等等。

          今天這篇文章就來(lái)給大家介紹一下 psutil 的常用功能和使用方法。

          首先我們需要安裝它,直接通過(guò)命令安裝即可:

          pip install psutil

          成功安裝之后來(lái)看看它的用法。

          CPU 相關(guān)

          獲取 CPU 的邏輯數(shù)量

          import psutil

          print(psutil.cpu_count())  # 12

          獲取 CPU 的物理核心數(shù)量

          import psutil

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

          結(jié)果為 6,說(shuō)明是 6 核超線程;如果 CPU 的物理核心數(shù) 和 邏輯數(shù)相等,也為 12,則說(shuō)明是 12 核非超線程。

          統(tǒng)計(jì) CPU 的用戶/系統(tǒng)/空閑時(shí)間

          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() 功能與之類似, 只不過(guò)返回的比例

          返回的是一個(gè) namedtuple,后面凡是結(jié)構(gòu)長(zhǎng)的和這里類似的,都是 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的邏輯數(shù)量是12, 所以每個(gè)列表里面有12個(gè)元素

          查看 CPU 的統(tǒng)計(jì)信息,包括上下文切換、中斷、軟中斷,以及系統(tǒng)調(diào)用次數(shù)等等

          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)

          內(nèi)存相關(guān)

          查看內(nèi)存使用情況

          import psutil

          print(psutil.virtual_memory())  
          # svmem(total=17029259264, available=8437215232, percent=50.5, used=8592044032, free=8437215232)
          • total: 總內(nèi)存

          • available: 可用內(nèi)存

          • percent: 內(nèi)存使用率

          • used: 已使用的內(nèi)存

          查看交換內(nèi)存信息

          import psutil

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

          關(guān)于物理內(nèi)存和交換內(nèi)存之間的關(guān)系。

          物理內(nèi)存:就是實(shí)際的內(nèi)存條提供的臨時(shí)數(shù)據(jù)存儲(chǔ)空間,在 Windows 上右鍵點(diǎn)擊計(jì)算機(jī),再點(diǎn)擊屬性時(shí),上面顯示的安裝內(nèi)存(RAM)就是電腦的物理內(nèi)存。這些內(nèi)存是實(shí)際存在的,在你不給機(jī)器增加內(nèi)存條的時(shí)候是不會(huì)改變的。

          交換內(nèi)存:交換內(nèi)存是專門用來(lái)臨時(shí)存儲(chǔ)數(shù)據(jù)的,通常在頁(yè)面調(diào)度和交換進(jìn)程數(shù)據(jù)時(shí)使用。相當(dāng)于在進(jìn)行內(nèi)存整理的時(shí)候,會(huì)先把部分?jǐn)?shù)據(jù)放在硬盤的某個(gè)地方,類似我們整理衣柜,衣服一多直接整理會(huì)很麻煩,因此會(huì)先把部分衣服放在其他地方,等衣柜里的衣服整理完了再把放在其它地方的衣服拿回來(lái)。這個(gè)其他地方放在計(jì)算機(jī)中則代表硬盤的某個(gè)地方,也就是我們所說(shuō)的交換區(qū)。通常當(dāng)使用交換內(nèi)存時(shí),是因?yàn)槲锢韮?nèi)存不足,正所謂衣柜,如果足夠大的話就沒(méi)必要拿出部分衣服放在其它地方, 直接在衣柜里就能解決了。

          虛擬內(nèi)存:首先,如果想要操作文件,可執(zhí)行程序等等,那么首先要把它們從磁盤上讀取到內(nèi)存中,因此 CPU 除了自己的那一部分小小的空間外,要想操作數(shù)據(jù),只能操作內(nèi)存里的數(shù)據(jù)。但是當(dāng)內(nèi)存不夠了,那么便會(huì)在硬盤上開(kāi)辟一份虛擬內(nèi)存,將物理內(nèi)存里的部分?jǐn)?shù)據(jù)放在虛擬內(nèi)存當(dāng)中。硬盤的空間很大,即使普通電腦安裝的固態(tài)硬盤也有一百個(gè) G,因此可以拿出一部分充當(dāng)虛擬內(nèi)存。不過(guò)虛擬內(nèi)存雖說(shuō)是內(nèi)存,但畢竟在硬盤上,速度絕對(duì)和 CPU 直接從物理內(nèi)存里讀取數(shù)據(jù)的速度相差甚遠(yuǎn)。這也是為什么那些大型網(wǎng)站將經(jīng)常被訪問(wèn)的一些數(shù)據(jù)放在 Redis 緩存里,而不是放在硬盤或者數(shù)據(jù)庫(kù)上。

          磁盤相關(guān)

          查看磁盤分區(qū)、磁盤使用率和磁盤 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')]
          """

          # 可以看到一共有三個(gè)盤符,fstype表示文件系統(tǒng)格式是NTFS,opts中的rw表示可讀寫(xiě)
          # 里面有一個(gè)參數(shù) all, 默認(rèn)為 False, 如果指定為 True, 那么返回的內(nèi)容還會(huì)包含 /proc 等特殊文件系統(tǒng)的掛載信息
          # 由于我這里是 Windows, 所以兩者沒(méi)區(qū)別

          查看某個(gè)磁盤使用情況

          import psutil

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

          查看磁盤 IO 統(tǒng)計(jì)信息

          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: 讀次數(shù)

          • write_count: 寫(xiě)次數(shù)

          • read_bytes: 讀的字節(jié)數(shù)

          • write_bytes: 寫(xiě)的字節(jié)數(shù)

          • read_time: 讀時(shí)間

          • write_time: 寫(xiě)時(shí)間

          默認(rèn)返回的是所有磁盤加起來(lái)的統(tǒng)計(jì)信息,我們可以指定 perdisk=True,則分別列出每一個(gè)磁盤的統(tǒng)計(jì)信息。

          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)}
          """

          網(wǎng)絡(luò)相關(guān)

          查看網(wǎng)卡的網(wǎng)絡(luò) IO 統(tǒng)計(jì)信息

          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: 發(fā)送的字節(jié)數(shù)
          # bytes_recv: 接收的字節(jié)數(shù)
          # packets_sent: 發(fā)送的包數(shù)據(jù)量
          # packets_recv: 接收的包數(shù)據(jù)量
          # errin: 接收包時(shí), 出錯(cuò)的次數(shù)
          # errout: 發(fā)送包時(shí), 出錯(cuò)的次數(shù)
          # dropin: 接收包時(shí), 丟棄的次數(shù)
          # dropout: 發(fā)送包時(shí), 丟棄的次數(shù)


          # 里面還有一個(gè) pernic 參數(shù), 如果為 True, 則列出所有網(wǎng)卡的信息
          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),
           '以太網(wǎng)': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0),
           '以太網(wǎng) 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),
           '藍(lán)牙網(wǎng)絡(luò)連接': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}
          """

          查看網(wǎng)絡(luò)接口信息

          from pprint import pprint
          import psutil

          # 以字典的形式返回網(wǎng)卡的配置信息, 包括 IP 地址、Mac地址、子網(wǎng)掩碼、廣播地址等等
          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)],
           '以太網(wǎng)': [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)],
           '以太網(wǎng) 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)],
           '藍(lán)牙網(wǎng)絡(luò)連接': [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)]}

          """

          # 返回網(wǎng)卡的詳細(xì)信息, 包括是否啟動(dòng)、通信類型、傳輸速度、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),
           '以太網(wǎng)': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
           '以太網(wǎng) 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),
           '藍(lán)牙網(wǎng)絡(luò)連接': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=3, mtu=1500)}
          """

          查看當(dāng)前機(jī)器的網(wǎng)絡(luò)連接

          from pprint import pprint
          import psutil

          # 以列表的形式返回每個(gè)網(wǎng)絡(luò)連接的詳細(xì)信息
          # 里面接受一個(gè)參數(shù), 默認(rèn)是 "inet", 當(dāng)然我們也可以指定為其它, 比如 "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 中有兩個(gè)命令可以做到這一點(diǎn), netstat 和 ss
          # $ netstat -nat
          # $ ss -nat

          # 但是在生產(chǎn)環(huán)境中, 線上服務(wù)器很多都是最小化安裝, 并不能保證每臺(tái)機(jī)器上都有 ss 或者 netstat 命令, 而這個(gè)時(shí)候 psutil 就派上用場(chǎng)了

          查看當(dāng)前登錄的用戶信息

          from pprint import pprint
          import psutil

          pprint(psutil.users())  
          # [suser(name='satori', terminal=None, host='0.0.0.0', started=1609841661.0, pid=None)]
          • name: 用戶名

          • terminal: 終端

          • host: 主機(jī)地址

          • started: 登錄時(shí)間

          • pid: 進(jìn)程id

          查看系統(tǒng)的啟動(dòng)時(shí)間

          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

          進(jìn)程管理

          psutil 還提供了很多和進(jìn)程管理相關(guān)的功能函數(shù),非常的豐富,我們來(lái)看一下。

          查看當(dāng)前存在的所有進(jìn)程的 pid

          from pprint import pprint
          import psutil

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

          查看某個(gè)進(jìn)程是否存在

          from pprint import pprint
          import psutil

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

          返回所有進(jìn)程(Process)對(duì)象組成的迭代器

          from pprint import pprint
          import psutil

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

          根據(jù) pid 獲取一個(gè)進(jìn)程對(duì)應(yīng)的 Process 對(duì)象

          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')

          獲取進(jìn)程相關(guān)的具體信息

          我們說(shuō)根據(jù) pid 可以獲取一個(gè)進(jìn)程對(duì)應(yīng)的 Process 對(duì)象,而這個(gè)對(duì)象里面包含了該進(jìn)程的全部信息。

           from pprint import pprint
          import psutil

          p = psutil.Process(pid=16948)

          # 進(jìn)程名稱
          print(p.name()) # WeChat.exe

          # 進(jìn)程的exe路徑
          print(p.exe()) # D:\WeChat\WeChat.exe

          # 進(jìn)程的工作目錄
          print(p.cwd()) # D:\WeChat

          # 進(jìn)程啟動(dòng)的命令行
          print(p.cmdline()) # ['D:\\WeChat\\WeChat.exe']

          # 當(dāng)前進(jìn)程id
          print(p.pid) # 16948

          # 父進(jìn)程id
          print(p.ppid()) # 11700

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

          # 子進(jìn)程列表
          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')]
          """


          # 進(jìn)程狀態(tài)
          print(p.status()) # running

          # 進(jìn)程用戶名
          print(p.username()) # LAPTOP-264ORES3\satori

          # 進(jìn)程創(chuàng)建時(shí)間,返回時(shí)間戳
          print(p.create_time()) # 1561775539.0

          # 進(jìn)程終端
          # 在windows上無(wú)法使用
          try:
              print(p.terminal())
          except Exception as e:
              print(e) # 'Process' object has no attribute 'terminal'

          # 進(jìn)程使用的cpu時(shí)間
          print(p.cpu_times())  # pcputimes(user=133.3125, system=188.203125, children_user=0.0, children_system=0.0)

          # 進(jìn)程所使用的的內(nèi)存
          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)
          """


          # 進(jìn)程打開(kāi)的文件
          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),
           ......
           ......
           ......
           ]
          """


          # 進(jìn)程相關(guān)的網(wǎng)絡(luò)連接
          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')]
          """


          # 進(jìn)程內(nèi)的線程數(shù)量,這個(gè)進(jìn)程開(kāi)啟了多少個(gè)線程
          print(p.num_threads())  # 66

          # 這個(gè)進(jìn)程內(nèi)的所有線程信息
          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),
           ......
           ......
           ......
           ]
          """


          # 進(jìn)程的環(huán)境變量
          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'}
          """


          # 結(jié)束進(jìn)程, 返回 None, 執(zhí)行之后微信就會(huì)被強(qiáng)制關(guān)閉, 當(dāng)然這里就不試了
          # print(p.terminal())  # None

          我們還可以調(diào)用 psutil.test 來(lái)模擬 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
          ......................
          ......................
          ......................
          ......................
          ......................
          """

          它是怎么做的呢?還記得我們之前說(shuō)的 process_iter 嗎?會(huì)返回所有進(jìn)程的 Process 對(duì)象,直接依次輸出里面的信息即可。同理,我們也可以通過(guò) process_iter 找到某一個(gè)進(jìn)程對(duì)應(yīng)的進(jìn)程 id。

          import psutil

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


          # 有了這個(gè)騷操作之后,我們便可以通過(guò)進(jìn)程 id 找到對(duì)應(yīng)的進(jìn)程
          # 然后修改里面的數(shù)據(jù)

          小結(jié)

          總的來(lái)說(shuō),psutil 這個(gè)庫(kù)可以獲取很多底層的信息,在處理系統(tǒng)監(jiān)控、資源管理等任務(wù)時(shí)是非常有用的工具。

          如果文章對(duì)你有幫助,歡迎轉(zhuǎn)發(fā)/點(diǎn)贊/收藏~



          _往期文章推薦_

          把Python的200個(gè)標(biāo)準(zhǔn)庫(kù)分類整理了下




          如需了解付費(fèi)精品課程教學(xué)答疑服務(wù)
          請(qǐng)?jiān)?strong style="max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;">Crossin的編程教室內(nèi)回復(fù): 666

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码三级视频在线观看 | 操逼黄色视频网站 | 一本高清无码 | 免费黄色小视频 | 久艹|