首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现windows下的Python USB设备监听器

如何实现windows下的Python USB设备监听器
EN

Stack Overflow用户
提问于 2015-07-03 07:08:57
回答 2查看 2.7K关注 0票数 1

我想要一个监听USB端口并在连接后将USB路径保存到文件中的python程序:

代码语言:javascript
复制
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."

然后在主文件中调用它:

代码语言:javascript
复制
import os
import time

while True:
    os.system("python test.py")
    time.sleep(1)

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

EN

回答 2

Stack Overflow用户

发布于 2015-07-03 07:36:57

您的实现存在一些问题:

  1. 您的‘主’文件调用test.py每秒调用一次,但test.py在调用之前和之后之间等待5秒。我不记得python系统调用是否阻塞了调用者--所以要么a)如果它没有阻塞,那么test.py就会再次被调用,而它还在等待获取调用后的调用;或者b)如果它阻塞了,那么在“main”中有一秒钟的延迟,在那里永远看不到变化。下面的Fix:#2修复了这个问题,没有单独的programs.
  2. Because test.py之前确定,等待5秒,然后确定之后,然后退出,在退出和启动之间可能发生U盘更改,并且不会被test.py报告为更改。你需要让test.py从不退出-它应该在启动之前设置,然后每五秒检查一次,如果after不同,那么用after的新值更新before,然后返回等待另一个五秒。Fix: test.py永远不应该退出-它应该是'main',或者永远在线程中运行。
  3. 如果设备是在之前确定之后插入的,那么在确定之后之前删除,即在最多五秒内,test.py永远不会报告这一点。修复:可能无关紧要,如果使用轮询,那么您必须在两次检查之间延迟一段时间。唯一真正的解决方案是不使用轮询,而是挂钩到驱动器更改的操作系统事件通知中,这也是最强大的implementation...

无论如何,假设轮询是最好的解决方案,那么test.py中的代码应该是这样的(注意,test.py永远不会退出,否则您可能会错过任何更改):

代码语言:javascript
复制
  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
票数 0
EN

Stack Overflow用户

发布于 2019-01-23 17:13:15

您好,我使用python refer drive-monitoring制作了这个应用程序,它是一种基于事件的方法来创建有关可移动驱动器历史记录和驱动器中的文件系统事件的报告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31196057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档