2014-03-27 6 views
5

Ich benutze eine C-Bibliothek von Python mit Ctypes. Es gibt eine Callback-Funktion mit einem void * Argument, das ich als ctypes.py_object verwende. Der Objektzeiger wird der Bibliothek übergeben, wenn der Rückruf registriert wird. Wenn es jedoch nicht mehr vom Python-Code referenziert wird, sollte es zerstört werden. Ich will es überleben, bis die Callback-Funktion aufgerufen wird. Wie mache ich das?Ctypes - Referenzen von C zu Python-Objekte

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

Könnten Sie zeigen ein Beispiel für den Code, den Sie mit der Callback-Funktion verwendet? Dies würde es viel einfacher machen, zu zeigen, wie man es modifiziert (ansonsten müsste ein Antworter ein Beispiel schreiben, einige Vermutungen darüber anstellen, wie man sich ihm nähert und erst dann die Frage beantworten). –

+0

Es gibt eine globale Callback-Funktion wird häufig für verschiedene Objekte registriert und nicht registriert. –

+0

Kannst du nicht einfach einen Verweis auf deine 'Object (i)' -Aufrufe im Python-Code behalten, so dass sie nicht als Müll gesammelt werden? – ebarr

Antwort

2

Sie könnten versuchen, Erhöhen/Vermindern des refcount manuell:

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)