玩转psutil 教你用Python检测U盘插入和拔出

谁说我们用python开辟检测U盘插入和拔出,必然要挪用pywin32接口挪用API才能做到的?

事实上,绝年夜部门人城市用windowsAPI的WndProc回调函数来取得WM_DEVICECHANGE动静,然后判定U盘的转变(这个过程,windows会标的目的所有窗口广播WM_DEVICECHANGE动静)。

下面小编就教大师一种另类的方式:用Python + psutil实现检测U盘插入和拔出功能。

1教你怎么用python挪用windows的API

1手把手教你怎么安装Python psutil包

1教你怎么安装pywin32(Python挪用win api必看)

东西/原料

  • python3
  • psutil

方式/步调

  1. 1

    起头之前,请确保小伙伴具备以下常识:

    Python的根本常识(包罗切片、引用全局变量、轮回等等根本常识)

    若有不懂,或者是需要这份代码。请在经验底部给小编投票或有得留言,小编看到会第一时候答复。

    别的经验引用是一些附加常识,它可以帮忙你快速开辟出如许的法式。

    而且确保电脑中装有psutil包。

    查看的方式如下:

    打开cmd号令提醒符:pip list | find "psutil"

  2. 2

    思绪阐发:

    我们经由过程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获得分区个数)

  3. 3

    我们获得了驱动器个数之后,我们必需要知道驱动器是什么类型的,以此来区分是我们的硬盘仍是我们的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

  4. 4

    界说一个函数,用于更新数据(也就是上面界说的几个全局变量的数据),返回驱动器数目

    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)                                        #返回当前驱动器数

  5. 5

    界说一个打印函数(其目标是打印驱动器信息 参数为驱动器数目)

    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

  6. 6

    本家儿函数:

    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)

  7. 7

    运行成果如图?

    怎么样?是不是很赞?学会没?点一波存眷吧(*^__^*) 

是否帮到了您?若是有帮到您,请点个存眷、点个投票、点个分享、点个赞

  1. 1

    怎么存眷?

    在经验的右上角小编头像旁边点击存眷,如图。

  2. 2

    怎么点赞?

    请在经验左侧点赞,如图。

  3. 3

    怎么投票?

    在经验的下方点击投票,如图。

  4. 4

    若是感觉小编写的还不错,可以动动鼠标把它分享给您的伴侣。

    如何分享,鼠标移动到右下角第一个按钮上,在弹出的选项中进行分享,如图。

    不尽感谢感动。

注重事项

  • 人生苦短,我用Python
  • 若有疑问,点击左下角的投票或者有得给小编留言,小编看到会第一时候答复您,感谢
  • 若是喜好本经验,请存眷我。可以把它分享给您的伴侣,请点个投票点个保藏。感谢,您的撑持是我最年夜的动力。
  • 发表于 2018-07-07 00:00
  • 阅读 ( 1036 )
  • 分类:其他类型

相关问题

0 条评论

请先 登录 后评论