From a7c25eadbc998bf359e5b7dac03aaea8c30d2932 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 17 May 2018 08:51:27 +0200 Subject: [PATCH 4/9] lsusb.py: fix up Python 3 conversion - Use open() and ignore encoding errors - Replace removed __cmp__ by rich comparison methods - Convert commented-out print statements, remove unused future import Fixes #68 --- lsusb.py.in | 50 ++++++++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/lsusb.py.in b/lsusb.py.in index 0f4d318..083b512 100644 --- a/lsusb.py.in +++ b/lsusb.py.in @@ -12,8 +12,6 @@ import os, sys, re, getopt -# from __future__ import print_function - # Global options showint = False showhubint = False @@ -53,15 +51,12 @@ class UsbClass: self.desc = str def __repr__(self): return self.desc - def __cmp__(self, oth): - # Works only on 64bit systems: - #return self.pclass*0x10000+self.subclass*0x100+self.proto \ - # - oth.pclass*0x10000-oth.subclass*0x100-oth.proto - if self.pclass != oth.pclass: - return self.pclass - oth.pclass - if self.subclass != oth.subclass: - return self.subclass - oth.subclass - return self.proto - oth.proto + def __lt__(self, oth): + return (self.pclass, self.subclass, self.proto) < \ + (oth.pclass, oth.subclass, oth.proto) + def __eq__(self, oth): + return (self.pclass, self.subclass, self.proto) == \ + (oth.pclass, oth.subclass, oth.proto) class UsbVendor: "Container for USB Vendors" @@ -70,8 +65,10 @@ class UsbVendor: self.vname = vname def __repr__(self): return self.vname - def __cmp__(self, oth): - return self.vid - oth.vid + def __lt__(self, oth): + return self.vid < oth.vid + def __eq__(self, oth): + return self.vid == oth.vid class UsbProduct: "Container for USB VID:PID devices" @@ -81,13 +78,10 @@ class UsbProduct: self.pname = pname def __repr__(self): return self.pname - def __cmp__(self, oth): - # Works only on 64bit systems: - # return self.vid*0x10000 + self.pid \ - # - oth.vid*0x10000 - oth.pid - if self.vid != oth.vid: - return self.vid - oth.vid - return self.pid - oth.pid + def __lt__(self, oth): + return (self.vid, self.pid) < (oth.vid, oth.pid) + def __eq__(self, oth): + return (self.vid, self.pid) == (oth.vid, oth.pid) usbvendors = [] usbproducts = [] @@ -107,7 +101,7 @@ def parse_usb_ids(): mode = 0 strg = "" cstrg = "" - for ln in file(usbids, "r").readlines(): + for ln in open(usbids, "r", errors="ignore"): if ln[0] == '#': continue ln = ln.rstrip('\n') @@ -146,7 +140,7 @@ def parse_usb_ids(): def bin_search(first, last, item, list): "binary search on list, returns -1 on fail, match idx otherwise, recursive" - #print "bin_search(%i,%i)" % (first, last) + #print("bin_search(%i,%i)" % (first, last)) if first == last: return -1 if first == last-1: @@ -233,7 +227,7 @@ def find_dev(driver, usbname): for nm in devlst: dir = prefix + usbname prep = "" - #print nm + #print(nm) idx = nm.find('/') if idx != -1: prep = nm[:idx+1] @@ -404,8 +398,8 @@ class UsbDevice: try: self.nointerfaces = int(readattr(fname, "bNumInterfaces")) except: - #print "ERROR: %s/bNumInterfaces = %s" % (fname, - # readattr(fname, "bNumInterfaces"))a + #print("ERROR: %s/bNumInterfaces = %s" % (fname, + # readattr(fname, "bNumInterfaces"))) self.nointerfaces = 0 try: self.driver = readlink(fname, "driver") @@ -421,7 +415,7 @@ class UsbDevice: for dirent in os.listdir(prefix + self.fname): if not dirent[0:1].isdigit(): continue - #print dirent + #print(dirent) if os.access(prefix + dirent + "/bInterfaceClass", os.R_OK): iface = UsbInterface(self, self.level+1) iface.read(dirent) @@ -532,7 +526,7 @@ def usage(): def read_usb(): "Read toplevel USB entries and print" for dirent in os.listdir(prefix): - #print dirent, + #print(dirent) if not dirent[0:3] == "usb": continue usbdev = UsbDevice(None, 0) @@ -590,7 +584,7 @@ def main(argv): fix_usbclass() except: print(" WARNING: Failure to read usb.ids", file=sys.stderr) - #print >>sys.stderr, sys.exc_info() + #print(sys.exc_info(), file=sys.stderr) read_usb() # Entry point -- 2.14.4