ctypes-从C到python对象的引用
我使用的是python中的C库,使用的是ctypes。有一个带有void*参数的回调函数,我将其用作ctypes.py_对象。注册回调时,对象指针将被提供给库。但是,当不再从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
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我不希望这样。