How to detect a new usb device is connected on python

23,053

Solution 1

this is operating system dependent

in linux you can use pyudev for this :

Almost the complete libudev functionality is exposed. You can:

  • Enumerate devices, filtered by specific criteria (pyudev.Context)
  • Query device information, properties and attributes,
  • Monitor devices, both synchronously and asynchronously with background threads, or within the event loops of Qt (pyudev.pyqt4, pyudev.pyside), glib (pyudev.glib) and wxPython (pyudev.wx).

https://pyudev.readthedocs.io/en/latest/

source code is in http://pyudev.readthedocs.io/en/v0.14/api/monitor.html, see the receive_device() function

in windows you can use the WMI ( Windows Management Instrumentation ) like in https://blogs.msdn.microsoft.com/powershell/2007/02/24/displaying-usb-devices-using-wmi/ ( Python Read the Device Manager Information ) or a python binding like in https://pypi.python.org/pypi/infi.devicemanager

Solution 2

An alternative (also for windows) could be to use PySerial. You could use a QTimer (from PyQt) instead of the while-loop, either in a singlethreaded or multithreaded configuration. A basic example (without QTimer or threading):

import time
from serial.tools import list_ports  # pyserial

def enumerate_serial_devices():
    return set([item for item in list_ports.comports()])

def check_new_devices(old_devices):
    devices = enumerate_serial_devices()
    added = devices.difference(old_devices)
    removed = old_devices.difference(devices)
    if added:
        print 'added: {}'.format(added)
    if removed:
        print 'removed: {}'.format(removed)
    return devices

# Quick and dirty timing loop 
old_devices = enumerate_serial_devices()
while True:
    old_devices = check_new_devices(old_devices)
    time.sleep(0.5)
Share:
23,053
Harel2320
Author by

Harel2320

Updated on August 09, 2020

Comments

  • Harel2320
    Harel2320 almost 4 years

    I want to make something which will run on the background and only after the computer detect new device is connected the rest of the code will run, is there any elegant way to do such a thing?

  • ScumbagNiad
    ScumbagNiad over 3 years
    This script could miss a change because it updated the drives variable with new data after the check, the last line should be drives = uncheckeddrives to prevent this.
  • elomage
    elomage about 3 years
    This code is using a busy wait - not efficient on resources...
  • Mauricio Gracia Gutierrez
    Mauricio Gracia Gutierrez almost 2 years
    this example can help you - askubuntu.com/a/1414424/94200