Как с помощью cython вызвать функцию c callback, написанную на C?

Пользователь

от eryn.rodriguez , в категории: C/C++ , 23 дня назад

Как с помощью cython вызвать функцию c callback, написанную на C?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от magali , 20 дней назад

@eryn.rodriguez 

Для того, чтобы вызвать функцию обратного вызова (callback) на языке C из Cython, нужно выполнить следующие шаги:

  1. Определить сигнатуру функции обратного вызова на языке C в Cython. Например, если функция обратного вызова имеет следующую сигнатуру:
1
void my_callback(int arg1, float arg2);


То в Cython сигнатура будет выглядеть так:

1
2
cdef extern from "myheader.h":
    void my_callback(int arg1, float arg2)


  1. Создать указатель на функцию обратного вызова и передать его в функцию на языке C. Например, если функция на языке C принимает указатель на функцию обратного вызова следующим образом:
1
void register_callback(void (*callback)(int, float));


То в Cython можно сделать следующее:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cdef extern from "myheader.h":
    void register_callback(void (*callback)(int, float))

cdef void my_cython_callback(int arg1, float arg2):
    # Реализация функции обратного вызова на Cython
    pass

def register_cython_callback():
    cdef void (*callback)(int, float) = &my_cython_callback
    register_callback(callback)


В данном примере мы создаем функцию my_cython_callback на Cython, которая будет вызываться в качестве функции обратного вызова. Затем мы создаем указатель на эту функцию и передаем его в функцию register_callback на языке C.

  1. Реализовать функцию обратного вызова на Cython, которая будет вызываться из функции на языке C. Например:
1
2
cdef void my_cython_callback(int arg1, float arg2):
    print("my_cython_callback: arg1 = {}, arg2 = {}".format(arg1, arg2))


  1. Вызвать функцию на языке C, которая будет вызывать функцию обратного вызова. Например:
1
register_cython_callback()


В данном примере мы вызываем функцию register_cython_callback, которая создает указатель на функцию my_cython_callback на Cython и передает его в функцию register_callback на языке C. При этом функция register_callback будет вызывать функцию my_cython_callback из Cython.