ctypes - 从C到python对象的引用

Hri*_*nev 6 python ctypes reference-counting

我正在使用ctypes从python中使用C库.有一个带有void*参数的回调函数我用作ctypes.py_object.注册回调时,对象指针将提供给库.但是当它不再从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))
Run Code Online (Sandbox Code Playgroud)

Rya*_*n P 4

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

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)
Run Code Online (Sandbox Code Playgroud)