如何在windows环境下实现Python-USB设备侦听器

2024-09-27 23:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个python程序,它可以监听USB端口并在将save USB path连接到一个文件之后:

import string
from ctypes import windll
import time
import os

def get_drives():
    drives = []
    bitmask = windll.kernel32.GetLogicalDrives()
    for letter in string.uppercase:
        if bitmask & 1:
            drives.append(letter)
        bitmask >>= 1
    return drives


if __name__ == '__main__':
  before = set(get_drives())
  print ('Please wait...')
  time.sleep(5)
  after = set(get_drives())
  drives = after - before
  delta = len(drives)

if (delta):
    for drive in drives:
        if os.system("cd " + drive + ":") == 0:
            newly_mounted = drive
            print "There were %d drives added: %s. Newly mounted drive letter is %s" % (delta, drives, newly_mounted)
            f = open( 'path.txt', 'w' )
            f.write(newly_mounted)
            f.close()
else:
    print "Sorry, I couldn't find any newly mounted drives."

然后在主文件中调用它:

^{pr2}$

但它不能正常工作,当我连接USB时,它有时会工作,有时也会。有什么办法可以改进吗?在


Tags: 文件pathimportgetstringifdriveusb
2条回答

嗨,我用pythonreference创建了这个应用程序drive-monitoring这是一种基于事件的方法来创建关于可移动驱动器历史记录和驱动器中文件系统事件的报告。在

您的实现存在一些问题:

  1. 你的“主”文件调用测试.py每秒调用一次,但是测试.py前后等待5秒。我不记得python系统调用是否阻塞了调用者,所以a)如果它没有阻塞,那么测试.py在它仍在等待获取after时被再次调用,或者b)如果它确实阻塞了,那么“main”中会有一秒钟的延迟,在那里永远看不到更改。修正:下面的2通过没有单独的程序来解决这个问题。

  2. 因为测试.py确定之前,等待5秒,然后确定之后,然后退出,usb驱动器更改可能会在退出和启动之间发生,并且不会报告为更改测试.py. 你需要测试.py从不退出-它应该在开始时设置为before,然后每隔5秒检查一次,如果after不同,则使用after的新值更新before,然后返回等待5秒。修复:测试.py不应该退出-它应该是“main”,或者永远在线程中运行。

  3. 如果设备在确定“前”之后插入,然后在确定“之前”之前将其移除,即在最多5秒钟内,此情况不会由报告测试.py. 修正:可能不重要,如果使用轮询,那么您必须延迟一些检查间隔时间。唯一真正的解决方案是不使用轮询,而是将驱动器更改的事件通知挂接到操作系统中,这也是最健壮的实现。。。

无论如何,假设轮询是您的代码的最佳解决方案测试.py应该看起来像这样(注意测试.py永远不要退出,否则可能会错过变化):

  before = set(get_drives())
  while true:
    time.sleep(5)
    after = set(get_drives())
    drives = after - before
    delta = len(drives)

    if (delta):
      # ...process delta
      ...
      # finally, after becomes the new before WITHOUT re-reading the drives, that will happen again in five seconds...
      before = after

相关问题 更多 >

    热门问题