Я пытаюсь разработать код на C, который будет скомпилирован в DLL (или .SO для linux) с целью обработки некоторого внешнего ввода на высокой скорости и возврата результата в Python для последующей обработки.
Мой вопрос: каков наилучший способ регулярно возвращать значения (при> 1000 с времени в секунду) из функции C для использования в Python?
Я создал тестовый пример следующим образом:
//dummy_function.c
#include <stdio.h>
#include <Windows.h>
__declspec(dllexport) int runme() {
int i;
for (i=1; i<= 500; i++) {
printf("int = %d \n", i);
Sleep(100); // Add some arbitrary delay for now
}
}
Примечание: я импортирую Windows.h, чтобы использовать фиктивную задержку (имитирующую мою реальную проблему).Этот код может работать в Unix, используя вместо этого unistd.h (согласно: Каков правильный #include для функции 'sleep' в C? )
Этот код затем компилируется в.dll по
gcc -shared -o dummy_function.dll dummy_function.c
и импортируется в Python по:
import ctypes
libc = ctypes.CDLL('dummy_function.dll')
libc.runme() # Start running
При выполнении этого кода Python он выводит растущие целые числа.Однако перехват печатного вывода из C с использованием Python и последующая его обработка не кажутся хорошим способом сделать это (не масштабируемым для высокой скорости).
Вместо этого мне интересно, есть ли способ для большеголегко передать переменные в Python из DLL.Я предполагаю, что не хочу использовать функцию return
в C, так как она выходит из функции.
Я читал о передаче по ссылке в C, поэтому задаюсь вопросом, совместима ли она с ctypes.Могу ли я определить некоторую область памяти, в которую записывает код C, и затем Python опрашивает это?Или, лучше, какая-нибудь форма очереди / буфера, чтобы избежать пропущенных событий?
Буду признателен за любой совет, спасибо!