Python C-API: 从C函数填充Py_buffer

3 投票
1 回答
1410 浏览
提问于 2025-05-10 09:55

我现在遇到一个很大的难题,就是怎么把一大堆字节数据从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,我该怎么把它和一个PyObject关联起来,以便可以作为输入元组/参数传给Python函数?

这里有一个我正在尝试的代码示例(更新了以包含data_s的类型定义):

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 个回答

1

问题在于我没有找到适合我需求的API调用。这里有一个解决这个问题的调用(如果有人感兴趣的话):Py_BuildValue,相关的文档可以在这里找到:

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

撰写回答