CPython ABI Bindings
Pointers.py provides bindings out of the box for most of the CPython ABI.
The ABI follows the naming convention of
Py<namespace>_<method>, so you may use one by importing the namespace from pointers.py:
# example for PyEval_* methods from pointers import PyEval PyEval.something(...)
However, the method names are in
PascalCase, and according to PEP 8, Python functions should be named in
Since pointers.py is PEP 8 compliant, method names have been converted to snake case.
Here's an example with
from pointers import PyEval frame = PyEval.get_frame() # calls PyEval_GetFrame
Some functions don't just return
PyObject, and instead return something that can be casted instead (in this case,
Any binding that doesn't return a
PyObject* is simply converted to a
from pointers import PyEval frame = PyEval.get_frame() # frame is not a frame object, instead its StructPointer[FrameObject]
You may cast this pointer to the correct Python object by calling
from pointers import PyEval, struct_cast frame = struct_cast(PyEval.get_frame()) # frame is now a valid frame object!
I did say above that there is support for most of the ABI, so what isn't available right now?
- Any function using a format string
- Any function defined in the header file without parameter names
- Anything using a macro (such as
_Py_NO_RETURN) in its signature
However, there are a few other functions that are unsupported due to arbitrary reasons.
These will all be supported in the future.