鱼C论坛

 找回密码
 立即注册
查看: 3402|回复: 2

[已解决]有那个大佬用C写过python扩展,有一些问题请教

[复制链接]
发表于 2022-12-27 22:45:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Stubborn 于 2022-12-27 22:48 编辑

想用C语言给python写一个扩展

简单的例子一:
我在python中,使用我的扩展函数,可以正常,打印得到13;


  1. from my_method import fir_test_add

  2. print(fir_test_add(8, 5))
复制代码



对应的C原形是

  1. int test_add(int a, int b)
  2. {
  3.     return a + b ;
  4. }

  5. static PyObject  *
  6. Test_add(PyObject *self, PyObject *args){
  7.     int a,b;
  8.     if(!PyArg_ParseTuple(args ,"ii", &a, &b)) {
  9.         return NULL;
  10.     }
  11.     return (PyObject*)Py_BuildValue("i", test_add(a, b));
  12. }
复制代码



问题来了,如果我的python输入是一个列表长度不定,希望返回的也是一个固定长度的列表。
  1. from fir_method import fir_test_add

  2. print(fir_test_add([8, 5, 8, 9, 1, 8]))
复制代码


那么我对应的C接口应该怎么编写?

最佳答案
2022-12-28 02:10:46
hrpzcf 发表于 2022-12-27 23:17
研究过文档,奈何 C 基础不够扎实看不明白

谢谢,看完了
  1. static PyObject *
  2. Update(PyObject *self, PyObject *args)
  3. {
  4.     PyObject *PyList;
  5.     PyObject *PyItem;
  6.     Py_ssize_t length;

  7.     if(!PyArg_ParseTuple(args ,"O!", &PyList_Type, &PyList)) {
  8.         PyErr_SetString(PyExc_TypeError, "params must be a List");
  9.         return NULL;
  10.     }

  11.     length = PyList_Size(PyList);
  12.     int array[length];
  13.     for (int idx = 0; idx < length; ++idx)
  14.     {
  15.         PyItem = PyList_GetItem(PyList, idx);
  16.         array[idx] = PyLong_AsLong(PyItem);
  17.     }
  18.     int *arr = update_state(array, length);
  19.     int val0, val1, val2, val3, val4, val5, val6, val7, val8, val9;
  20.     val0 = arr[0];
  21.     val1 = arr[1];
  22.     val2 = arr[2];
  23.     val3 = arr[3];
  24.     val4 = arr[4];
  25.     val5 = arr[5];
  26.     val6 = arr[6];
  27.     val7 = arr[7];
  28.     val8 = arr[8];
  29.     val9 = arr[9];
  30.     return (PyObject*)Py_BuildValue("[i,i,i,i,i,i,i,i,i,i]", val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
  31. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-27 23:17:44 | 显示全部楼层
本帖最后由 hrpzcf 于 2022-12-27 23:33 编辑

研究过文档,奈何 C 基础不够扎实看不明白
  1. https://docs.python.org/zh-cn/3.7/c-api/list.html
  2. https://docs.python.org/zh-cn/3.7/c-api/allocation.html#c.PyObject_New
  3. https://docs.python.org/zh-cn/3.7/c-api/memory.html#object-allocators
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-28 02:10:46 | 显示全部楼层    本楼为最佳答案   
hrpzcf 发表于 2022-12-27 23:17
研究过文档,奈何 C 基础不够扎实看不明白

谢谢,看完了
  1. static PyObject *
  2. Update(PyObject *self, PyObject *args)
  3. {
  4.     PyObject *PyList;
  5.     PyObject *PyItem;
  6.     Py_ssize_t length;

  7.     if(!PyArg_ParseTuple(args ,"O!", &PyList_Type, &PyList)) {
  8.         PyErr_SetString(PyExc_TypeError, "params must be a List");
  9.         return NULL;
  10.     }

  11.     length = PyList_Size(PyList);
  12.     int array[length];
  13.     for (int idx = 0; idx < length; ++idx)
  14.     {
  15.         PyItem = PyList_GetItem(PyList, idx);
  16.         array[idx] = PyLong_AsLong(PyItem);
  17.     }
  18.     int *arr = update_state(array, length);
  19.     int val0, val1, val2, val3, val4, val5, val6, val7, val8, val9;
  20.     val0 = arr[0];
  21.     val1 = arr[1];
  22.     val2 = arr[2];
  23.     val3 = arr[3];
  24.     val4 = arr[4];
  25.     val5 = arr[5];
  26.     val6 = arr[6];
  27.     val7 = arr[7];
  28.     val8 = arr[8];
  29.     val9 = arr[9];
  30.     return (PyObject*)Py_BuildValue("[i,i,i,i,i,i,i,i,i,i]", val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
  31. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 09:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表