Python C-API:从C函数

时间:2015-11-17 00:50:40

标签: python c python-3.x cpython pep3118

我很难搞清楚如何将大字节数据从C传递到任意Python3函数。作为参考,这里有一些关于这个主题的文档链接:

https://docs.python.org/3.5/extending/embedding.html

文档中的大多数信息似乎都假设我将数据从Python传递给C.我需要做相反的事情。我找到了对API函数PyBuffer_FromContiguous的引用 - 但它没有在任何地方记录(我可以找到)。函数原型在这里:

PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf,
                                        Py_ssize_t len, char order);

基本上我有两个问题:

  1. 这是构建Py_buffer对象的正确方法吗?这甚至是正确的做法吗?
  2. 构造Py_buffer之后,如何将Py_bufferPyObject相关联,可以将其设置为输入元组/参数以调用python函数?
  3. 以下是我正在尝试的内容的代码示例(已更新为包含data_s typedef):

    typedef struct
    {
      size_t size;
      unsigned char* data;
    } data_s;
    
      // convert the arguments
      PyObject* pArgs;
      PyObject* pRes;
      Py_buffer* pBuf;
      pArgs = PyTuple_New((Py_ssize_t)num_args);
      if (num_args)
      {
        va_start(argp, num_args);
        for (i = 0; i < num_args; i++)
        {
          data_s* arg = va_arg(argp, data_s*);
          result = PyBuffer_FromContiguous(pBuf, arg->data, (Py_ssize_t)arg->size, 'C');
          if (result < 0)
          {
            fprintf(stderr, "Error: Unable to copy argument %d into python object\n", i);
            PY_DECREF(pArgs);
            break;
          }
    
          // set pValue, something like this?
          PyTuple_SetItem(pArgs, i, pBuf->obj);
        }
      }
    
      // run the function
      pRes = PyObject_CallObject(func_entry->pFunc, pArgs);
    
      // error checking... 
    

    ......我真的很感激这些问题上的任何线索。

1 个答案:

答案 0 :(得分:1)

问题是我找不到合适的API调用我需要的东西。以下是解决此问题的调用(如果有人关心):Py_BuildValue并在此处记录:

https://docs.python.org/3/extending/extending.html#building-arbitrary-values