鱼C论坛

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

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

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

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

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

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接口应该怎么编写?

最佳答案
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[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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 05:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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