5
我正在使用ctypes的python使用C庫。有一個帶有void *參數的回調函數,我用它作爲ctypes.py_object。對象指針在回調被註冊時被賦予庫。但是,當它不再被python代碼引用時,它應該被銷燬。我希望它能夠存活直到回調函數被調用。我怎麼做?ctypes - 從C到python對象的引用
我正在使用ctypes的python使用C庫。有一個帶有void *參數的回調函數,我用它作爲ctypes.py_object。對象指針在回調被註冊時被賦予庫。但是,當它不再被python代碼引用時,它應該被銷燬。我希望它能夠存活直到回調函數被調用。我怎麼做?ctypes - 從C到python對象的引用
你可以嘗試遞增/遞減手動引用計數:
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代碼中保留對'Object(i)'調用的引用,以便它們不被垃圾回收? – ebarr