从python调用C函数,并将数组作为函数的输入

2024-04-27 01:00:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我给一个数组作为C代码的输入。你知道吗

C代码如下:

int ECG(int* ECG_sample)
{
   for (int i=0;i<sizeof(ECG_sample);i++)
   {
      ecg_wave_sample = ECG_sample[i];
      Filter_CurrentECG_sample(&ecg_wave_sample, &ecg_filterout);  
      Calculate_HeartRate(ecg_filterout,&global_HeartRate); // calculate HeartRate
      printf("%d\n",global_HeartRate);
   }
   return global_HeartRate;
}

我需要用python调用这个函数。我已将文件名保存为ECG.c。我使用命令cc -fPIC -shared -o ECG.so ECG.c。你知道吗

我用ctypes这样调用c函数

import ctypes
from ctypes import *
import numpy as np
so_file = "/home/yasaswini/hp2-notebooks/notebooks/Algorithm_testing_on_database/ECG.so"
ECG_sample = np.zeros(2000,dtype=np.int32)
ECG_sample = [4,5,6....6,7]
main_1 = CDLL(so_file)
print(type(main_1)) \\line8
print(main_1.ECG(ECG_sample))

我现在得到这个错误,即使两个输入都是数组和int类型。你知道吗

ArgumentError Traceback (most recent call last)
<ipython-input-231-c871feac52f7> in <module>
    2 #print(main.ECG(ECG_sample))
    3 #fun(ctypes.c_void_p(ECG_sample.ctypes.data))
    ----> 4 print(main_1.ECG(ECG_sample))

ArgumentError: argument 1: <class 'TypeError'>: Don't know how to convert parameter 1

我还尝试了main_1(ctypes.c_void_p(ECG_sample.ctypes.data))而不是line8。但我有个错误

AttributeError Traceback (most recent call last)
<ipython-input-238-c96b4ca485d7> in <module>
    1 #while(1):
    2 #print(main.ECG(ECG_sample))
    ----> 3 main_1(ctypes.c_void_p(ECG_sample.ctypes.data))
    4 #print(main_1.ECG(ECG_sample))
AttributeError: 'list' object has no attribute 'ctypes'

有人能帮我解决这个问题吗?你知道吗


Tags: sampleimportdatasomainnp数组ctypes