3

我很难弄清楚如何将大字节数据数组从 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可以设置为输入元组/参数的 a 关联起来以调用 python 函数?

这是我正在尝试的代码示例(已更新以包含data_stypedef):

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... 

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

4

1 回答 1

1

问题是我没有找到适合我需要的 API 调用。这是解决此问题的调用(以防万一):Py_BuildValue并在此处记录:

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

于 2015-11-21T00:17:43.857 回答