You have two options:
- Porting an existing core runtime to Python. This is tedious and error prone.
- Wrapping an existing core runtime and expose it to Python.
I'd go with option 2. The simplest path would be to wrap and expose spine-c via ctypes or CFFI (see here).
You could also wrap the C API on top of spine-cpp as used by our new spine-flutter runtime, found here. This has the upside that there's no need for marshalling complex structs, with the downside that the timeline API is not fully exposed. The timeline API is usually not used, so it is not a big loss.