• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    玩轉psutil 教你用Python檢測U盤插入和拔出

    誰說我們用python開辟檢測U盤插入和拔出,必然要挪用pywin32接口挪用API才能做到的?

    事實上,絕年夜部門人城市用windowsAPI的WndProc回調函數來取得WM_DEVICECHANGE動靜,然后判定U盤的轉變(這個過程,windows會標的目的所有窗口廣播WM_DEVICECHANGE動靜)。

    下面小編就教大師一種另類的方式:用Python + psutil實現檢測U盤插入和拔出功能。

    1教你怎么用挪用的

    1手把手教你怎么安裝包

    1教你怎么安裝挪用必看

    東西/原料

    • 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
    • 閱讀 ( 2076 )
    • 分類:其他類型

    你可能感興趣的文章

    相關問題

    0 條評論

    請先 登錄 后評論
    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆