谁说我们用python开辟检测U盘插入和拔出,必然要挪用pywin32接口挪用API才能做到的?
事实上,绝年夜部门人城市用windowsAPI的WndProc回调函数来取得WM_DEVICECHANGE动静,然后判定U盘的转变(这个过程,windows会标的目的所有窗口广播WM_DEVICECHANGE动静)。
下面小编就教大师一种另类的方式:用Python + psutil实现检测U盘插入和拔出功能。
1教你怎么安装pywin32(Python挪用win api必看)
起头之前,请确保小伙伴具备以下常识:
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 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!