2014-03-27 32 views
5

我正在使用ctypes的python使用C庫。有一個帶有void *參數的回調函數,我用它作爲ctypes.py_object。對象指針在回調被註冊時被賦予庫。但是,當它不再被python代碼引用時,它應該被銷燬。我希望它能夠存活直到回調函數被調用。我怎麼做?ctypes - 從C到python對象的引用

​​
+2

你能證明你的回調函數中使用的代碼的例子嗎?這將使它更容易顯示如何修改它(否則回答者將不得不編寫一個示例,對你如何接近它做一些猜測,然後纔回答這個問題) –

+0

有一個全局回調函數爲不同的對象進行很多次註冊和註銷。 –

+0

難道你不能只是在python代碼中保留對'Object(i)'調用的引用,以便它們不被垃圾回收? – ebarr

回答

2

你可以嘗試遞增/遞減手動引用計數:

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) 
相關問題