Мое резервирование с подходом ctypes для этой проблемы заключается в том, что счетчик ссылок объекта ds не увеличивается автоматически и станет плохим указателем, если он выйдет из области видимости.
Лучший подход будетопределить модуль расширения Python C, который будет управлять счетчиком ссылок на данные.
Я использую статический PyObject * для хранения объекта, очевидно, реальная реализация будет хранить его более разумно.
static PyObject * ds;
PyObject* GiveDsToC(PyObject * self, PyObject * args)
{
PyObject * pThis=NULL;
unsigned long addr;
if(!PyArg_ParseTuple(args, "O", &ds))
return NULL;
/* Ensure the interpreter keeps ds around while we have it */
Py_INCREF(ds);
pThis = PyObject_GetAttrString(ds, "this"); // new reference
addr = PyLong_AsLong(pThis); // convert using __int__ method
Py_DECREF(pThis); // Release the object back
CallSomeCFunction(addr);
Py_RETURN_NONE;
}
void FinishedWithDS(void)
{
// Lock the GIL and decrement the reference counter
PyGILState_STATE state = PyGILState_Ensure();
Py_DECREF(ds);
PyGILState_Release(state);
}