<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Python 有一個第三方模組叫 psutil,專門用來獲取作業系統以及硬體相關的資訊,比如:CPU、磁碟、網路、記憶體等等。下面來看一下它的用法,不過在使用之前需要先安裝,直接 pip install psutil 即可。
獲取 CPU 的邏輯核心數量
import psutil print(psutil.cpu_count()) # 12 # 或者使用 multiprocessing import multiprocessing print(multiprocessing.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=84732.10937499999, system=37132.85937500023, idle=2003964.1249999998, interrupt=3500.765625, dpc=1089.6875) """ # 還有一個 psutil.cpu_times_percent() # 功能與之類似, 只不過返回的是比例
該函數返回的是一個 namedtuple,後面凡是結構長的和這裡類似的,都是 namedtuple。補充一下,如果你的程式中需要建立大量的物件,並且該物件的屬性固定不變,那麼不妨使用 namedtuple,相比使用字典,能節省大量空間。
檢視 CPU 的使用率
import psutil for x in range(3): # interval:表示每隔 0.5s 重新整理一次 # percpu:為 True 表示檢視所有的 cpu 使用率 print(psutil.cpu_percent(interval=0.5, percpu=True)) """ [9.1, 3.1, 12.5, 3.1, 15.6, 0.0, 6.2, 0.0, 12.5, 50.0, 9.4, 3.1] [9.1, 6.2, 12.5, 6.2, 3.1, 0.0, 0.0, 3.1, 0.0, 15.6, 3.1, 0.0] [0.0, 0.0, 15.6, 0.0, 6.2, 0.0, 6.2, 25.0, 3.1, 9.4, 6.2, 0.0] """ # 我這裡 cpu 的邏輯數量是 12 # 所以每個列表裡面有 12 個元素
檢視 CPU 的統計資訊
包括上下文切換、中斷、軟中斷,以及系統呼叫次數等等。
import psutil print(psutil.cpu_stats()) """ scpustats(ctx_switches=3346512902, interrupts=2288572793, soft_interrupts=0, syscalls=3324041552) """
檢視 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=7698505728, percent=54.8, used=9330753536, free=7698505728) """
total 表示總記憶體,available 表示可用記憶體,percent 表示記憶體使用率,used 表示已使用的記憶體,free 表示可用記憶體。
所以 available 加上 used 等於 total,used 除以 total 再乘以 100 等於 percent。
檢視交換記憶體資訊
import psutil print(psutil.swap_memory()) """ sswap(total=3087007744, used=4509839360, free=-1422831616, percent=146.1, sin=0, sout=0) """
說到記憶體,有實體記憶體、交換記憶體、虛擬記憶體,這三者有什麼區別呢?用大白話解釋就是:
1)實體記憶體是實際的記憶體條提供的臨時資料儲存空間,在 Windows 上右鍵點選計算機,再點選屬性時,上面顯示的安裝記憶體(RAM)就是電腦的實體記憶體。這些記憶體是實際存在的,在你不給機器增加記憶體條的時候是不會改變的。
2)交換記憶體通常在頁面排程和交換程序資料時使用,相當於在進行記憶體整理的時候,會先把部分資料放在硬碟的某塊區域。類似我們整理衣櫃,衣服一多直接整理會很麻煩,因此會先把部分衣服拿出來放在其它地方,等衣櫃裡的衣服整理完了,再把放在其它地方的衣服拿回來。
這個其它地方在計算機中則代表硬碟的某塊區域,也就是我們所說的交換區。通常使用交換記憶體是因為實體記憶體不足導致的,正所謂衣櫃,如果足夠大的話就沒必要拿出部分衣服放在其它地方, 直接在衣櫃裡就能解決了。
3)最後是虛擬記憶體,當操作檔案,可執行程式等等,那麼首先要把它們從磁碟讀取到記憶體中,因此 CPU 除了自己那一部分小小的空間外,要想運算元據,只能操作記憶體裡的資料。
但是當記憶體不夠了,那麼會在硬碟上開闢一份虛擬記憶體,將實體記憶體裡的部分資料放在虛擬記憶體當中。硬碟的空間很大,即使普通電腦安裝的固態硬碟也有一百個 G,因此可以拿出一部分充當虛擬記憶體。
不過虛擬記憶體雖說是記憶體,但畢竟在硬碟上,速度和 CPU 直接從實體記憶體裡讀取資料相差甚遠。這也是為什麼要將經常被存取的熱點資料放在 Redis 快取裡,而不是放在硬碟或者資料庫上。
檢視磁碟分割區、磁碟使用率和磁碟 IO 資訊
import psutil print(psutil.disk_partitions()) """ [sdiskpart(device='C:\', mountpoint='C:\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\', mountpoint='D:\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='E:\', mountpoint='E:\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260)] """
可以看到一共有三個碟符,fstype 表示檔案系統型別,這裡是 NTFS;opts 中的 rw 表示可讀寫。
該函數還可以接收一個引數 all,預設為 False。如果指定為 True,在 Linux 上返回的內容還會包含 /proc 等特殊檔案系統的掛載資訊。由於我這裡是 Windows,所以兩者沒區別。
檢視某個磁碟使用情況
import psutil print(psutil.disk_usage("C:\")) """ sdiskusage(total=267117391872, used=96894304256, free=170223087616, percent=36.3) """
檢視磁碟 IO 統計資訊
import psutil print(psutil.disk_io_counters()) """ sdiskio(read_count=1172461, write_count=2153031, read_bytes=36854982144, write_bytes=52718300160, read_time=551, write_time=1437) """
以上返回的是所有磁碟加起來的統計資訊,我們可以指定 perdisk=True,分別列出每一個分割區的統計資訊。
檢視網路卡的網路 IO 統計資訊
import psutil print(psutil.net_io_counters()) """ snetio(bytes_sent=175995567, bytes_recv=2849015622, packets_sent=1052206, packets_recv=3050302, errin=0, errout=0, dropin=3491, dropout=0) """ # bytes_sent: 傳送的位元組數 # bytes_recv: 接收的位元組數 # packets_sent: 傳送的包資料量 # packets_recv: 接收的包資料量 # errin: 接收包時, 出錯的次數 # errout: 傳送包時, 出錯的次數 # dropin: 接收包時, 丟棄的次數 # dropout: 傳送包時, 丟棄的次數 # 裡面還有一個 pernic 引數 # 如果為 True, 則列出所有網路卡的資訊 print(psutil.net_io_counters(pernic=True)) """ {'乙太網': snetio(bytes_sent=178716616, bytes_recv=2866823348, packets_sent=1058190, packets_recv=3102852, errin=0, errout=0, dropin=3491, dropout=0), 'WLAN': 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), '本地連線* 4': 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), '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)} """
檢視網路介面資訊
import psutil # 以字典的形式返回網路卡的設定資訊 # 包括 IP 地址、Mac地址、子網掩碼、廣播地址等等 print(psutil.net_if_addrs()) """ {'乙太網': [ 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='192.168.4.150', netmask='255.255.240.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::4826:a6a6:b5f4:3647', netmask=None, broadcast=None, ptp=None)], 'WLAN': [...], '本地連線* 3': [...], '本地連線* 4': [...], '藍芽網路連線': [...], 'Loopback Pseudo-Interface 1': [...]} """ # 返回網路卡的詳細資訊, 包括是否啟動、通訊型別、傳輸速度、mtu print(psutil.net_if_stats()) """ {'乙太網': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500), '藍芽網路連線': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=3, mtu=1500), 'Loopback Pseudo-Interface 1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1073, mtu=1500), 'WLAN': 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), '本地連線* 4': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500)} """
檢視當前機器的網路連線
import psutil # 以列表的形式返回每個網路連線的詳細資訊 # 裡面接受一個引數, 預設是 "inet" # 當然我們也可以指定為其它, 比如 "tcp" print(psutil.net_connections()) """ [sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='192.168.4.150', port=137), raddr=(), status='NONE', pid=4), sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='127.0.0.1', port=54872), raddr=(), status='NONE', pid=11652), sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.4.150', port=11253), raddr=addr(ip='117.50.19.136', port=80), status='CLOSE_WAIT', pid=11568), .... .... .... ] """
是不是很方便呢?在 Linux 中有兩個命令可以做到這一點,分別是 netstat 和 ss。另外該函數會返回所有的連線資訊,所以當連線數很多的時候,會佔用較高的記憶體。
檢視當前登入的使用者資訊
import psutil print(psutil.users()) """ [suser(name='satori', terminal=None, host='0.0.0.0', started=1609841661.0, pid=None)] """
檢視系統的啟動時間
import psutil from datetime import datetime print(psutil.boot_time()) # 1654012221.2945454 print( datetime.fromtimestamp(psutil.boot_time()) ) # 2022-05-31 23:50:21.294545
psutil 還提供了很多和程序管理相關的功能函數,非常的豐富,我們來看一下。
檢視當前存在的所有程序的 pid
import psutil print(psutil.pids()) """ [0, 4, 148, 532, 668, 796, 904, 912, 976, ...] """
檢視某個程序是否存在
import psutil print(psutil.pid_exists(22333)) # False print(psutil.pid_exists(532)) # True
返回所有程序(Process)物件組成的迭代器
import psutil print(psutil.process_iter()) """ <generator object process_iter at 0x000...> """ # 遍歷的話,會得到每一個程序物件 # 程序物件在 psutil 裡面的型別是 Process
根據 pid 獲取一個程序對應的 Process 物件
import psutil print(psutil.Process(14124)) """ psutil.Process(pid=14124, name='WeChat.exe', status='running', started='10:54:43') """ # 程序名稱是 WeChat.exe,狀態為執行中 # 啟動時間是早上 10 點 54 分
我們說根據 pid 可以獲取一個程序對應的 Process 物件,而這個物件裡面包含了該程序的全部資訊。
import psutil p = psutil.Process(14124) # 程序名稱 print(p.name()) """ WeChat.exe """ # 程序的exe路徑 print(p.exe()) """ D:WeChatWeChat.exe """ # 程序的工作目錄 print(p.cwd()) """ D:WeChat """ # 程序啟動的命令列 print(p.cmdline()) """ ['D:\WeChat\WeChat.exe'] """ # 當前程序id print(p.pid) """ 14124 """ # 父程序id print(p.ppid()) """ 8860 """ # 父程序 print(p.parent()) """ psutil.Process(pid=8860, name='explorer.exe', status='running', started='10:53:58') """ # 子程序列表 print(p.children()) """ [psutil.Process(pid=6852, name='WechatBrowser.exe', status='running', started='10:54:59'), psutil.Process(pid=1960, name='WeChatPlayer.exe', status='running', started='10:54:59'), psutil.Process(pid=10432, name='WeChatApp.exe', status='running', started='10:55:33')] """ # 程序狀態 print(p.status()) """ running """ # 程序使用者名稱 print(p.username()) """ LAPTOP-264ORES3satori """ # 程序建立時間,返回時間戳 print(p.create_time()) """ 1654570483.2370846 """ # 程序終端 # 在windows上無法使用 try: print(p.terminal()) except Exception as e: print(e) """ 'Process' object has no attribute 'terminal' """ # 程序使用的cpu時間 print(p.cpu_times()) """ pcputimes(user=27.8125, system=13.484375, children_user=0.0, children_system=0.0) """ # 程序所使用的的記憶體 print(p.memory_info()) """ pmem(rss=110141440, vms=116899840, num_page_faults=661356, peak_wset=221048832, wset=110141440, peak_paged_pool=834824, paged_pool=806216, peak_nonpaged_pool=144584, nonpaged_pool=78560, pagefile=116899840, peak_pagefile=197505024, private=116899840) """ # 程序開啟的檔案 print(p.open_files()) # 程序相關的網路連線 print(p.connections()) """ [pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.4.150', port=7693), raddr=addr(ip='58.251.111.106', port=8080), status='ESTABLISHED'), pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=8680), raddr=(), status='LISTEN')] """ # 程序內的執行緒數量,這個程序開啟了多少個執行緒 print(p.num_threads()) # 58 # 這個程序內的所有執行緒資訊 print(p.threads()) """ [pthread(id=14128, user_time=11.3125, system_time=7.578125), pthread(id=13428, user_time=0.0, system_time=0.0), pthread(id=13616, user_time=0.0, system_time=0.0), pthread(id=13600, user_time=0.015625, system_time=0.328125), pthread(id=7364, user_time=0.078125, system_time=0.015625), ... ] """ # 程序的環境變數 print(p.environ()) # 結束程序 # 執行之後微信就會被強制關閉, 這裡就不試了 # p.terminal()
我們還可以呼叫 psutil.test 來模擬 ps 命令。
import psutil psutil.test()
輸出如下:
它是怎麼做的呢?還記得我們之前說的 process_iter 嗎?會返回所有程序的 Process 物件,直接依次輸出裡面的資訊即可。同理,我們也可以通過 process_iter 找到某一個程序對應的程序 id。
import psutil for prcs in psutil.process_iter(): if prcs.name().lower() == "wechat.exe": print(prcs) """ psutil.Process(pid=14124, name='WeChat.exe', status='running', started='10:54:43') """
有了這個操作之後,我們便可以找到對應的程序,然後藉助作業系統的 kernal 修改程序內部的資料。
到此這篇關於Python利用psutil實現獲取硬體,網路和程序資訊的文章就介紹到這了,更多相關Python psutil獲取資訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45