| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 Stubborn 于 2022-12-27 22:48 编辑  
 
想用C语言给python写一个扩展 
 
简单的例子一: 
我在python中,使用我的扩展函数,可以正常,打印得到13; 
 
 
- from my_method import fir_test_add
 
  
- print(fir_test_add(8, 5))
 
  复制代码 
 
 
对应的C原形是 
 
- int test_add(int a, int b)
 
 - {
 
 -     return a + b ;
 
 - }
 
  
- static PyObject  *
 
 - Test_add(PyObject *self, PyObject *args){
 
 -     int a,b;
 
 -     if(!PyArg_ParseTuple(args ,"ii", &a, &b)) {
 
 -         return NULL;
 
 -     }
 
 -     return (PyObject*)Py_BuildValue("i", test_add(a, b));
 
 - }
 
  复制代码 
 
 
问题来了,如果我的python输入是一个列表长度不定,希望返回的也是一个固定长度的列表。 
- from fir_method import fir_test_add
 
  
- print(fir_test_add([8, 5, 8, 9, 1, 8]))
 
  复制代码 
 
那么我对应的C接口应该怎么编写? 
 
谢谢,看完了
 - static PyObject *
 
 - Update(PyObject *self, PyObject *args)
 
 - {
 
 -     PyObject *PyList;
 
 -     PyObject *PyItem;
 
 -     Py_ssize_t length;
 
  
-     if(!PyArg_ParseTuple(args ,"O!", &PyList_Type, &PyList)) {
 
 -         PyErr_SetString(PyExc_TypeError, "params must be a List");
 
 -         return NULL;
 
 -     }
 
  
-     length = PyList_Size(PyList);
 
 -     int array[length];
 
 -     for (int idx = 0; idx < length; ++idx)
 
 -     {
 
 -         PyItem = PyList_GetItem(PyList, idx);
 
 -         array[idx] = PyLong_AsLong(PyItem);
 
 -     }
 
 -     int *arr = update_state(array, length);
 
 -     int val0, val1, val2, val3, val4, val5, val6, val7, val8, val9;
 
 -     val0 = arr[0];
 
 -     val1 = arr[1];
 
 -     val2 = arr[2];
 
 -     val3 = arr[3];
 
 -     val4 = arr[4];
 
 -     val5 = arr[5];
 
 -     val6 = arr[6];
 
 -     val7 = arr[7];
 
 -     val8 = arr[8];
 
 -     val9 = arr[9];
 
 -     return (PyObject*)Py_BuildValue("[i,i,i,i,i,i,i,i,i,i]", val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
 
 - }
 
  复制代码 
 
 
 |   
 
 
 
 |