How to detect a new usb device is connected on python
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)
Harel2320
Updated on August 09, 2020Comments
-
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?
-
Turbo J over 6 yearsHave a look at this question with code.
-
-
ScumbagNiad over 3 yearsThis 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 about 3 yearsThis code is using a busy wait - not efficient on resources...
-
Mauricio Gracia Gutierrez almost 2 yearsthis example can help you - askubuntu.com/a/1414424/94200