import pyudev import threading class DevicePoller: def __init__(self, dev): self.device_added = threading.Event() self.device_removed = threading.Event() self.device = dev self.wait_add = self.device_added.wait self.wait_remove = self.device_removed.wait self.have = self.device_added.is_set if dev: self.device_added.set() def launch_observer(self, monitor, device_match): if not monitor: monitor = pyudev.Monitor.from_netlink(pyudev.Context()) def handle_event(action, device): if action == 'add' and device_match(device): self.device = device self.device_removed.clear() self.device_added.set() elif action == 'remove' and device == self.device: self.device = None self.device_added.clear() self.device_removed.set() self.observer = pyudev.MonitorObserver(monitor, handle_event) self.observer.start() def stop_observer(): self.observer.stop() def simple_devicer(subsystem, predicate): dev = None context = pyudev.Context() for try_dev in context.list_devices(subsystem=subsystem): if predicate(try_dev): dev = try_dev break monitor = pyudev.Monitor.from_netlink(context) monitor.filter_by(subsystem) devicer = DevicePoller(dev) devicer.launch_observer(monitor, predicate) return devicer if __name__ == '__main__': dexcom_g5_product = '22a3/47/100' def is_dexcom_g5(dev): try: return dev.parent.get('PRODUCT') == dexcom_g5_product except: return False devicer = simple_devicer('tty', is_dexcom_g5) while True: print("waiting for device") devicer.wait_add() while devicer.have(): print("poll device {0}".format(devicer.device)) print("sleep(5)") if devicer.wait_remove(5): print("device removed") devicer.stop_observer()