2014-03-27 9 views
5

저는 파이썬에서 ctypes를 사용하여 C 라이브러리를 사용하고 있습니다. ctypes.py_object로 사용하고있는 void * 인자를 가진 콜백 함수가 있습니다. 객체 포인터는 콜백이 등록 될 때 라이브러리에 주어집니다. 그러나 파이썬 코드에서 더 이상 참조되지 않으면 파손되어야합니다. 콜백 함수가 호출 될 때까지 생존하기를 원합니다. 어떻게해야합니까?ctypes - C에서 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)) 
+2

당신은 당신이 콜백 함수에서 사용되는 코드의 예를 보여 주시겠습니까? 이렇게하면 수정 방법을 훨씬 쉽게 표시 할 수 있습니다. 그렇지 않으면 답변자가 예제를 작성하고 접근 방법에 대해 추측해야하며 질문에 답해야합니다. –

+0

다음과 같은 전역 콜백 함수가 있습니다. 다른 개체에 대해 등록되고 등록되지 않은 상태가됩니다. –

+0

파이썬 코드에서'Object (i)'호출에 대한 참조를 유지하여 가비지 수집을 할 수 없습니까? – ebarr

답변

2

당신은/증가 수동 refcount가를 감소시키는 시도 할 수 :

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)