Running Double Track Python 2.7 & 3.10
Support for Python 2.7 is to be discontinued. It's replacements, Python 3.0 and later, have significant differences, some of which can be unexpected. Some of these I'm listing here. The main difference, string handling, is straightforward and clearly documented, and won't be described here.
The "xrange()" function in p2.7 has been renamed to replace the "range()" function in p3. If similar functionality as with p2.7 "range" is required then it must be defined. E.G. "def _range(*p): return list(range(*p))" Threading is handled differently, There is a compatible library, _thread , but it has some differences. All integers in p3 are treated as long. Explicit long integers as in p2.7 do not exist in p3.
The ctypes library is handled differently in versions 3.10 and later.
The sequence:
m=libc.malloc(100)
libc.free(m)
where functions are defined in libc works for version 3.9 and earlier
but fails with 3.10 .
Including the following beforehand fixes this:
  class fresult(ct.Structure):
    _fields_ = [("bytes", ct.POINTER(ct.c_ubyte))]
    libc.malloc.restype=ct.POINTER(fresult)
A similar bug is found when a c program routine returns a pointer:
  class result(ct.Structure):
    _fields_ = [("length", ct.c_int),("bytes", ct.POINTER(ct.c_ubyte))]
  mylib.func.restype=ct.POINTER(result)
  res=mylib.func(bb,len(bb))
  ba=bytearray(result.bytes[:result.length])
  libc.free(result.bytes) # works for python versions 3.10 and earlier.
  libc.free(ct.addressof(res.contents)) # worked for python version 3.9 and earlier
Debian Release Bookworm seems to have bugs which make bluetooth fail or become unreliable. This could have some connection with Python3 versions greater than or equal to 3.10 .