Из Python, как передать объект фрейма, полученный в обратном вызове sys.settrace, в функцию c ++, которая принимает void * - PullRequest
0 голосов
/ 07 февраля 2019

из функции обратного вызова sys.settrace, как передать объект фрейма в c ++, который принимает void *

Ограничения (в данной ситуации): Принудительно использовать sys.settrace (нельзя использовать PyEval_SetTrace)Также функция c ++ не может принимать код PyObject * или PyFrameObject *

C ++ (для этого создаются привязки Python SWIG):

class TEST_DECLS InterpPython{
static int TraceHook(void *frame, hwString what, void * arg);
}

Код Python:

sys.settrace(_trace_hook)
def _trace_hook(frame, event, arg):
  InterpPython_TraceHook(frame,event, arg)

Результаты:

Ошибка типа: в методе 'InterpPython_TraceHook', аргумент 1 типа 'void *'

1 Ответ

0 голосов
/ 09 февраля 2019

Попробуйте использовать карту типов для преобразования входного объекта Python в void*, если это параметр void* frame.Вы также можете добавить проверку того, что объект на самом деле является PyFrameObject.

%typemap(in) void* frame %{
    $1 = (void*)$input;
%}
...