Stubborn 发表于 2022-12-27 22:45:52

有那个大佬用C写过python扩展,有一些问题请教

本帖最后由 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())

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

hrpzcf 发表于 2022-12-27 23:17:44

本帖最后由 hrpzcf 于 2022-12-27 23:33 编辑

研究过文档,奈何 C 基础不够扎实看不明白
https://docs.python.org/zh-cn/3.7/c-api/list.html
https://docs.python.org/zh-cn/3.7/c-api/allocation.html#c.PyObject_New
https://docs.python.org/zh-cn/3.7/c-api/memory.html#object-allocators

Stubborn 发表于 2022-12-28 02:10:46

hrpzcf 发表于 2022-12-27 23:17
研究过文档,奈何 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;
    for (int idx = 0; idx < length; ++idx)
    {
      PyItem = PyList_GetItem(PyList, idx);
      array = PyLong_AsLong(PyItem);
    }
    int *arr = update_state(array, length);
    int val0, val1, val2, val3, val4, val5, val6, val7, val8, val9;
    val0 = arr;
    val1 = arr;
    val2 = arr;
    val3 = arr;
    val4 = arr;
    val5 = arr;
    val6 = arr;
    val7 = arr;
    val8 = arr;
    val9 = arr;
    return (PyObject*)Py_BuildValue("", val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
}
页: [1]
查看完整版本: 有那个大佬用C写过python扩展,有一些问题请教