ctypes-从C到python对象的引用

ctypes-从C到python对象的引用,python,ctypes,reference-counting,Python,Ctypes,Reference Counting,我使用的是python中的C库,使用的是ctypes。有一个带有void*参数的回调函数,我将其用作ctypes.py_对象。注册回调时,对象指针将被提供给库。但是,当不再从python代码中引用它时,应该将其销毁。我希望它在回调函数被调用之前继续存在。我该怎么做 callback_t=ctypes.CFUNCTYPE(None, ctypes.py_object) clib.register_callback.argtypes=[callback_t, ctypes.py_object] cl

我使用的是python中的C库,使用的是ctypes。有一个带有void*参数的回调函数,我将其用作ctypes.py_对象。注册回调时,对象指针将被提供给库。但是,当不再从python代码中引用它时,应该将其销毁。我希望它在回调函数被调用之前继续存在。我该怎么做

callback_t=ctypes.CFUNCTYPE(None, ctypes.py_object)
clib.register_callback.argtypes=[callback_t, ctypes.py_object]
clib.register_callback.restype=None

class Object:
    def __init__(self, val):
        self.val=val

def callback(obj):
    print(obj.val)

callback_c=callback_t(callback)

def calledByOtherCode(val):
    clib.register_callback(callback_c, Object(val))

您可以尝试手动递增/递减引用计数:

def calledByOtherCode(val):
    o = Object(val)
    pyo = ctypes.py_object(o)
    ctypes.pythonapi.Py_IncRef(pyo)
    clib.register_callback(o)

def callback(obj):
    print(obj.val)
    pyobj = ctypes.py_object(obj)
    ctypes.pythonapi.Py_DecRef(pyobj)

你能举一个你在回调函数中使用的代码的例子吗?这将使演示如何修改它变得更容易(否则回答者将不得不写一个例子,猜测你是如何处理它的,然后才回答问题)有一个全局回调函数,可以为不同的对象多次注册和注销。您不能在python代码中保留对
对象(i)
调用的引用,以便它们不会被垃圾收集吗?@ebarr我不希望这样。