Как определить плагин флешки в Windows с помощью Python?

Я хочу, чтобы мой компьютер с Windows запускал сценарий Python, когда он обнаруживает, что к нему подключен флеш-накопитель с определенным именем (например, «Мой диск»).

Как я могу этого добиться?

Должен ли я использовать какой-либо инструмент в Windows или есть способ написать другой скрипт Python для обнаружения присутствия флешки, как только она будет подключена? (Я бы предпочел, чтобы сценарий был на компьютере.)

(Я новичок в программировании ..)


person Mahela Munasinghe    schedule 28.12.2009    source источник


Ответы (3)


Основываясь на подходе «CD», что, если ваш сценарий перечислит список дисков, подождет несколько секунд, пока Windows назначит букву диска, а затем повторно перечислит список? Набор Python может сказать вам, что изменилось, не так ли? Для меня сработало следующее:

# building on above and http://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
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())
    pause = raw_input("Please insert the USB device, then press ENTER")
    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)
    else:
        print "Sorry, I couldn't find any newly mounted drives."
person mellow-yellow    schedule 06.03.2012

Хотя вы можете использовать метод, аналогичный предложенному inpectorG4dget, но это будет очень неэффективно.

Для этого вам нужно использовать Win API. Эта страница может быть вам полезна: Ссылка

А чтобы использовать Win API в Python, проверьте эту ссылку: Ссылка

person UltraInstinct    schedule 28.12.2009
comment
Это работает, но требует установки как минимум одного дополнительного модуля. - person inspectorG4dget; 29.12.2009

Что ж, если вы используете дистрибутив Linux, то ответ на этот вопрос по SO будет.

Я могу придумать обходное (не элегантное) решение вашей проблемы, но, по крайней мере, оно будет РАБОТАТЬ.

Каждый раз, когда вы вставляете флешку в порт USB, ОС Windows присваивает ей букву диска. Для целей этого обсуждения назовем эту букву «F».

Этот код проверяет, можем ли мы перейти в f:\. Если есть возможность записать cd в f:\, то мы можем сделать вывод, что буква диска была назначена букве «F», и, предполагая, что вашему флеш-накопителю всегда присваивается буква «F», мы можем сделать вывод, что ваш флеш-накопитель был подключенный.

import os
def isPluggedIn(driveLetter):
    if os.system("cd " +driveLetter +":") == 0: return True
    else: return False
person inspectorG4dget    schedule 28.12.2009
comment
Но диск не всегда будет иметь одну и ту же букву. Как я могу это объяснить? - person Mahela Munasinghe; 28.12.2009
comment
В том-то и дело. Я не могу придумать, как это сделать прямо сейчас. Но, по крайней мере, это частичное решение. Я разместил его только потому, что на тот момент другого решения не было. Поэтому я решил, что частичное решение будет лучше, чем вообще ничего. - person inspectorG4dget; 29.12.2009