Python C API:在c中调用python c方法的问题

问题描述 投票:3回答:1

在我的模块中,有一个方法将python列表除以double并将其除以]]

static PyObject *st_div_r(PyObject *self, PyObject *args){
  PyObject *pList;

  Py_ssize_t n;
  double x;
  int i;

  if (!PyArg_ParseTuple(args, "O!d", &PyList_Type, &pList, &x)) {
    PyErr_SetString(PyExc_TypeError, "parameters are wrong.");
    return NULL;
    }



  n = PyList_Size(pList);
  for(i=0;i<n;i++)
  {
    PyList_SetItem(pList,i,Py_BuildValue("d",PyFloat_AsDouble(PyList_GetItem(pList,i))/x));
        };
  Py_INCREF(pList);
  return pList;
}

它是这样的

my_mod.st_div_r([1,2,3],0.5)
[2,4,6]

我想在模块的另一个方法中使用st_div_r,该方法获取列表列表,将其第一个元素除以double并返回它

static PyObject *det(PyObject *self, PyObject *args){ 
  PyObject *pList;
  double d = 2.0;

  if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &pList)) {
    PyErr_SetString(PyExc_TypeError, "parameters are  wrong.");
    return NULL;
    }


  PyList_SetItem(pList,0,st_div_r(pList,(PyList_GetItem(pList,0),Py_BuildValue("d",d))));

  Py_INCREF(pList);


  return pList;
}

它应该像这样工作

my_mod.det([[1,2],[3,4]])
[[0.5,1],[3,4]]

但是这不起作用

 TypeError: parameters are wrong

所以,问题是如何在det内调用st_div_r以及如何作为self传递。将不胜感激。谢谢

在我的模块中,有一个方法将python列表除以双静态PyObject * st_div_r(PyObject * self,PyObject * args){PyObject * pList; Py_ssize_t n;双x;我...

python-c-api
1个回答
3
投票

您必须创建一个PyTuple作为您自己的函数(st_div_r)的第二个参数!

© www.soinside.com 2019 - 2024. All rights reserved.