Python Ctype: проблема с обратным вызовом при создании пользовательской библиотеки Python - PullRequest
0 голосов
/ 20 августа 2010

Весь сценарий таков:

  • в моей библиотеке c есть функция setmessagelistener (a_structure, function_pointer).
  • Я пишу библиотеку Python , которая является оберткой для вышеупомянутой библиотеки c, используя Ctypes . так что я сделал что-то вроде этого:

    def setlistener(a_structure,function_pointer)
    
     listenerDeclaration = CFUNCTYPE(c_void_p, c_void_p)
    
     listenerFunction = listenerDeclaration(function_pointer)
    
     setMsgListener = c_lib.setMessageListener
    
     setMsgListener.argtypes = [c_void_p, c_void_p]
    
     setMsgListener.restype = c_ubyte
    
     if (setMsgListener(a_structure, listenerFunction)==0):
    
        sys.exit("Error setting message listener.")
    
  • Теперь другая программа на python использует вышеуказанную функцию из моей библиотеки python для выполнения работы, но проблема в следующем:

когда я запускаю программу, это вызывает ошибку сегментации, потому что локальный объект (функция прослушивателя) уже собран мусором (я так думаю), когда управление возвращается из библиотечной функции setListener () как локальный объект.

есть ли какое-нибудь решение этой проблемы? Или я что-то упустил? пожалуйста, предложите ... спасибо заранее

1 Ответ

1 голос
/ 02 сентября 2010

Как вы подозреваете, вам нужно хранить ссылку на listenerFunction так долго, как это необходимо. Возможно, оберните функцию в классе, создайте экземпляр и установите listenerFunction в качестве переменной-члена.

См. Документацию по Python для ctypes обратных вызовов , особенно важное примечание в конце раздела.

...