誰說我們用python開辟檢測U盤插入和拔出,必然要挪用pywin32接口挪用API才能做到的?
事實上,絕年夜部門人城市用windowsAPI的WndProc回調函數來取得WM_DEVICECHANGE動靜,然后判定U盤的轉變(這個過程,windows會標的目的所有窗口廣播WM_DEVICECHANGE動靜)。
下面小編就教大師一種另類的方式:用Python + psutil實現檢測U盤插入和拔出功能。
1教你怎么用挪用的
1手把手教你怎么安裝包
1教你怎么安裝挪用必看
起頭之前,請確保小伙伴具備以下常識:
Python的根本常識(包羅切片、引用全局變量、輪回等等根本常識)
若有不懂,或者是需要這份代碼。請在經驗底部給小編投票或有得留言,小編看到會第一時候答復。
別的經驗引用是一些附加常識,它可以幫忙你快速開辟出如許的法式。
而且確保電腦中裝有psutil包。
查看的方式如下:
打開cmd號令提醒符:pip list | find "psutil"
思緒闡發:
我們經由過程psutil包內的disk_partitions()方式獲得驅動器數(或者說是分區數,windows上完全可以如許理解)
disk_partitions()會返回一個對象列表(列表內的有M個sdiskpart對象)
它們的格局如下:
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'),.....]
我們可以看到如許一個列表,里面有多個(磁盤驅動器數)對象。
sdiskpart對象有以部屬性:
device:驅動器(可以理解為分區)
mountpoint:掛載點 (也可以理解為分區,Windows上都是一樣的)
fstype:文件類型
opts:掛載選項(若是小伙伴學過linux的mount,對這個必定不目生,可以理解為它的權限和信息)
詳情可以參考下經驗引用(玩轉psutil:教你怎么用Python獲得分區個數)
我們獲得了驅動器個數之后,我們必需要知道驅動器是什么類型的,以此來區分是我們的硬盤仍是我們的U盤,或者是收集映射仍是光盤之類的。
我們可以經由過程opts屬性來闡發,我們上面也說過,opts是一個驅動器在掛載時被設心猿意馬的參數,例如opts='rw,fixed'
rw參數意味著可讀可寫,而fixed申明它是一個當地驅動器(查查這個單詞就知道了)
再來看看這個:opts='rw,removable'
這個removable是意思是:可移動的,可拆的
這就可以讓我們區分硬盤和U盤
那么,我們有了驅動器個數,而且知道怎么區分驅動類型之后,我們就可以經由過程一個輪回,不竭的獲取驅動器個數,若是發現驅動器個數少于之前,即是拔出,驅動器多于之前即是插入。
對不合錯誤??
OK。起頭寫我們的代碼。
import psutil
import time,sys
from win32gui import MessageBox as box
#/*
# * ---全局數據 及時更新
# */
local_device = [] #當地驅動器
local_letter = [] #當地盤符
local_number = 0 #當地驅動器數
mobile_device = [] #移動設備
mobile_letter = [] #移動設備盤符
mobile_number = 0 #移動設備數
這里我們用到了一個windows API函數MessageBox,挪用提醒框用,不消tkinter的原因是因為tkinter只為了畫一個提醒框,半斤八兩不便利。
有關這個函數請參考百科MessageBox或者MSDN
界說一個函數,用于更新數據(也就是上面界說的幾個全局變量的數據),返回驅動器數目
def updata():
global local_device,local_letter,local_number,\
mobile_device,mobile_letter,mobile_number
#引入全局變量
tmp_local_device,tmp_local_letter = [],[]
tmp_mobile_device,tmp_mobile_letter = [],[]
tmp_local_number,tmp_mobile_number = 0,0
try:
part = psutil.disk_partitions()
except:
print("法式發生異常!!!")
box(None,"很抱愧,法式發生了異常","致命錯誤",0)
sys.exit(-1)
else:
#* 驅動器分類
for i in range(len(part)):
tmplist = part[i].opts.split(",")
if tmplist[1] == "fixed": #掛載選項數據內讀到fixed = 當地設備
tmp_local_number = tmp_local_number + 1
tmp_local_letter.append(part[i].device[:2]) #獲得盤符信息
tmp_local_device.append(part[i])
else:
tmp_mobile_number = tmp_mobile_number + 1
tmp_mobile_letter.append(part[i].device[:2])
tmp_mobile_device.append(part[i])
#*淺切片
local_device,local_letter = tmp_local_device[:],tmp_local_letter[:]
mobile_device,mobile_letter = tmp_mobile_device[:],tmp_mobile_letter[:]
local_number,mobile_number = tmp_local_number,tmp_mobile_number
return len(part) #返回當前驅動器數
界說一個打印函數(其目標是打印驅動器信息 參數為驅動器數目)
def print_device(n):
global local_device,local_letter,local_number,\
mobile_device,mobile_letter,mobile_number
print("=" * 50 + "\n讀取到" + str(n) + "個驅動器")
for l in range(local_number):
print(local_letter[l],end="") #列出當地驅動器盤符
print("{" + local_device[0].opts + "}")
if(len(mobile_device)): #列出移動驅動器盤符
for m in range(mobile_number):
print(mobile_letter[m],end="")
print("{" + mobile_device[0].opts + "}")
else:
None
print("歷程進入監聽狀況 " + "*" * 10)
return
本家兒函數:
if __name__ == "__main__":
#*初度讀取驅動器信息,打印驅動器具體
now_number = 0 #及時驅動數
before_number = updata() #更新數據之前的驅動數
print_device(before_number)
#歷程進入輪回 Loop Seconds = 1s
while True:
now_number = updata()
if(now_number > before_number):
print("檢測到移動磁盤被插入...")
print_device(now_number)
box(None,"移動磁盤被插入\n","新插入磁盤",0)
before_number = now_number #刷新數據
elif(now_number < before_number):
print("檢測到移動磁盤被拔出...")
print_device(now_number)
box(None,"移動磁盤被拔出\n","磁盤被拔出",0)
before_number = now_number
time.sleep(1)
運行成果如圖?
怎么樣?是不是很贊?學會沒?點一波存眷吧(*^__^*)
怎么存眷?
在經驗的右上角小編頭像旁邊點擊存眷,如圖。
怎么點贊?
請在經驗左側點贊,如圖。
怎么投票?
在經驗的下方點擊投票,如圖。
若是感覺小編寫的還不錯,可以動動鼠標把它分享給您的伴侶。
若何分享,鼠標移動到右下角第一個按鈕上,在彈出的選項中進行分享,如圖。
不盡感謝感動。
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!